【问题标题】:c# why sendmessage didn't workc#为什么sendmessage不起作用
【发布时间】:2018-01-28 02:07:33
【问题描述】:

为什么 C++ WindowProc 函数没有收到来自 c# 的消息? C# 代码使用 SendMessage() 调用 c++ ExeC.exe。但是在 Switch case WM_COPYDATA IN WindowProc 函数中没有响应。

C# 完整代码:

public partial class MainWindow : Window
{   
    public const string strFilePath = "C:/Users/gandis/Desktop/Project/ExeC/Release/ExeC.exe";
    public const Int32 WM_COPYDATA = 0x004A;

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 message, int wParam, ref int lParam);


    public MainWindow()
    {
        InitializeComponent();
    }

    private void btn_Start_Click(object sender, RoutedEventArgs e)
    {
        IntPtr hWnd = GetHandle(strFilePath);

        if (hWnd.ToInt32() > 0)
        {
            int cdss = 1;
            SendMessage(hWnd, WM_COPYDATA, 1, ref cdss);
        }

    }

    private IntPtr GetHandle(string strFilePath)
    {
        IntPtr hWnd = IntPtr.Zero;

        hWnd = GetProcess(strFilePath).MainWindowHandle;

        return hWnd;
    }

    private Process GetProcess(string strFilePath)
    {
        Process proc = new Process();

        proc.StartInfo.FileName = strFilePath;
        proc.Start();

        proc.WaitForInputIdle();

        return proc;
    }
}

我在 MFC 中只添加了 WindowProc 虚拟功能。

C++ 代码:

LRESULT CExeCDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{

switch (message)
{
case WM_COPYDATA:

    AfxMessageBox(_T(__FUNCTION__));
    break;

}

return CDialog::WindowProc(message, wParam, lParam);
}

【问题讨论】:

    标签: c# c++ sendmessage


    【解决方案1】:

    您对SendMessage() 的声明是错误的。 wParam 应该是 UIntPtrlParam 应该是 IntPtr。而且您缺少DllImport 上的SetLastError=true 属性。

    if (hWnd.ToInt32() > 0) 应该是if (hWnd != IntPtr.Zero)

    你应该在调用proc.WaitForInputIdle()之后和查询proc.MainWindowHandle之前调用proc.Refresh()

    但是,最重要的是,您对WM_COPYDATA 消息的输入值是错误的,因此消息很可能根本无法发送(但您忽略了SendMessage()Marshal.GetLastWin32Error() 的返回值,所以您不会知道)。阅读文档:

    w参数

    传递数据的窗口句柄。

    l参数

    指向包含要传递的数据的 COPYDATASTRUCT 结构的指针。

    您正在传递一个文字 1,其中应该是 HWND,并且您正在传递一个对 int 的引用,其中应该是对 COPYDATASTRUCT 的引用。

    COPYDATASTRUCT 的 C# 定义以及使用 SendMessage() 发送它的示例可在 pinvoke.net 上找到:

    http://www.pinvoke.net/default.aspx/Structures.COPYDATASTRUCT

    [StructLayout(LayoutKind.Sequential)]
    struct COPYDATASTRUCT
    {
       public IntPtr dwData;    // Any value the sender chooses.  Perhaps its main window handle?
       public int cbData;       // The count of bytes in the message.
       public IntPtr lpData;    // The address of the message.
    }
    
    const int WM_COPYDATA = 0x004A;
    

    // An example of sending a message containing a txStruct.
    public SendMessage()
    {
       IntPtr buffer = IntPtrAlloc(txStruct);
       COPYDATASTRUCT copyData = new COPYDATASTRUCT();
       copyData.dwData = IntPtr.Zero;
       copyData.lpData = buffer;
       copyData.cbData = Marshal.SizeOf(txStruct);
       IntPtr copyDataBuff = IntPtrAlloc(copyData);
       SendMessage(hWnd, WM_COPYDATA, IntPtr.Zero, copyDataBuff);
       IntPtrFree(ref copyDataBuff);
       IntPtrFree(ref buffer);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      • 2023-03-30
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多