2012-06-06 108 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