【问题标题】:SendMessage to a window Handle向窗口句柄发送消息
【发布时间】:2012-06-06 06:52:06
【问题描述】:

我正在尝试使用 sendmessage 将消息从我的 c++ 应用程序传递到 c#

我的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 也我硬编码了正确的句柄我正在回拨但没有得到任何数据

我的 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);
       }

【问题讨论】:

  • suggested COPYDATASTRUCT 看起来和你的不一样。 (例如LayoutKind.Sequential 属性)。
  • 评论指的是WM_ACTIVATEAPPCOPYDATASTRUCT建议WM_COPYDATA,但5555都不是。
  • 是的,你是对的......非常感谢你......我没想到......谢谢你的hvd

标签: c# c++ sendmessage


【解决方案1】:

我稍微修改了源代码,它正在工作。在 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;

【讨论】:

    【解决方案2】:

    您正在尝试做的是一些基本的 IPC(进程间通信)。

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

    也许一些基本的 COM 会帮助你。这很简单,您不再需要使用 SendMessage、窗口句柄之类的东西

    Introduction to COM

    Introduction to COM Part 2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多