2012-06-06 58 views
2

我尝试使用SendMessage函数从我的C++应用程序将消息传递给C#SendMessage函数窗口句柄

我的C++代码是这样的

int _tmain(int argc, _TCHAR* argv[]) 
{ 

COPYDATASTRUCT cpd; 
cpd.dwData = 0;  
LPCWSTR strDataToSend = L"http://google.com";; 

    cpd.cbData = (wcslen(strDataToSend) + 1) * 2; 
    cpd.lpData = (PVOID)strDataToSend; 
SendMessage((HWND)0x0020073C,5555,0,(LPARAM)&cpd); 


return 0; 
} 

我试着用SendMessageW也是我硬编码的处理这是正确的我正在hetting回调,但没有得到任何数据

我的C#应用​​程序是这样的

public struct COPYDATASTRUCT 
    { 
     public IntPtr dwData; 
     public int cbData; 
     [MarshalAs(UnmanagedType.LPStr)] 
     public string lpData; 
    } 


    protected override void WndProc(ref Message m) 
    { 
     // Listen for operating system messages. 

     switch (m.Msg) 
     { 
      // The WM_ACTIVATEAPP message occurs when the application 
      // becomes the active application or becomes inactive. 
      case 5555: 

       COPYDATASTRUCT mystr = new COPYDATASTRUCT(); 
       Type mytype = mystr.GetType(); 
       mystr = (COPYDATASTRUCT)m.GetLParam(mytype); 
       MessageBox.Show (mystr.cbData.ToString()); 
       MessageBox.Show(mystr.lpData); 
       break; 
      } 
      base.WndProc(ref m); 
      } 

我得到的消息框空白...... 我试着用了用COPYDATASTRUCT只是我的传球串PLZ任何一个可以帮助我..提前 感谢


int _tmain(int argc, _TCHAR* argv[]) 
    { 

    COPYDATASTRUCT cpd; 
    cpd.dwData = 0;  
    LPCWSTR strDataToSend = L"http://google.com";; 

    cpd.cbData = (wcslen(strDataToSend) + 1) * 2; 
    cpd.lpData = (PVOID)strDataToSend; 
    SendMessage((HWND)0x0020073C,WM_COPYDATA,0,(LPARAM)&cpd); 


return 0; 
} 

C#代码

public struct COPYDATASTRUCT 
{ 
    public IntPtr dwData; 
    public int cbData; 
    [MarshalAs(UnmanagedType.LPStr)] 
    public string lpData; 
} 
public const int WM_COPYDATA = 0x4A; 


protected override void WndProc(ref Message m) 
{ 
    // Listen for operating system messages. 

    switch (m.Msg) 
    { 
     // The WM_ACTIVATEAPP message occurs when the application 
     // becomes the active application or becomes inactive. 
     case WM_COPYDATA: 

      COPYDATASTRUCT mystr = new COPYDATASTRUCT(); 
      Type mytype = mystr.GetType(); 
      mystr = (COPYDATASTRUCT)m.GetLParam(mytype); 
      MessageBox.Show (mystr.cbData.ToString()); 
      MessageBox.Show(mystr.lpData); 
      break; 
     } 
     base.WndProc(ref m); 
     } 
+0

的[建议'COPYDATASTRUCT'(http://www.pinvoke.net/default .aspx/Structures/COPYDATASTRUCT.html)似乎看起来不同于你的。 (例如'LayoutKind.Sequential'属性)。 –

+2

该注释涉及'WM_ACTIVATEAPP','COPYDATASTRUCT'建议'WM_COPYDATA',但5555既不是那些。 – hvd

+1

是的,你是对的....谢谢你v多.....我没想过....谢谢你的hvd –

回答

0

我修改了一些源代码,它工作。从C++代码我用这个呼叫

SendMessage((HWND)0x0020073C,WM_COPYDATA,0,(LPARAM)&cpd);

在C#应用我用以下

public const int WM_COPYDATA = 0x004A; 

COPYDATASTRUCT

[StructLayout(LayoutKind.Sequential)] 
     public struct COPYDATASTRUCT 
     { 
      public IntPtr dwData; 
      public int cbData; 
      public IntPtr lpData; 
     } 

和消息处理程序被修改这样

case WM_COPYDATA:   

        COPYDATASTRUCT mystr = new COPYDATASTRUCT();    

        mystr = (COPYDATASTRUCT)Marshal.PtrToStructure(m.LParam, typeof(COPYDATASTRUCT)); 

        if (mystr.cbData > 0) 
        { 
         byte[] data = new byte[mystr.cbData]; 
         Marshal.Copy(mystr.lpData, data, 0, mystr.cbData); 
         Encoding unicodeStr = Encoding.Unicode; 
         char[] myString = unicodeStr.GetChars(data); 
         string returnText = new string(myString); 
         MessageBox.Show("Text is " + returnText); 
        } 


        break; 
0

你想要做的是一些基本的IPC(进程间通信)。

这不是C#的问题,但是对于C++来说是这样。

也许一些基本的COM会帮助你。这是很容易的,你不再需要使用SendMessage函数,窗户把手和像

Introduction to COM

Introduction to COM Part 2