c#为什么sendmessage没有工作

时间:2018-01-28 02:07:34

标签: c# c++ sendmessage

为什么C ++ WindowProc函数不接收来自c#的消息? C#代码使用SendMessage()调用c ++ ExeC.exe。但是在Switch案例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);
}

1 个答案:

答案 0 :(得分:0)

您对SendMessage()的声明是错误的。 wParam应为UIntPtrlParam应为IntPtr。您错过了SetLastError=true上的DllImport属性。

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

在致电proc.Refresh()之后,在查询proc.WaitForInputIdle()之前,您应致电proc.MainWindowHandle

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

  

的wParam

     

传递数据的窗口句柄。

     

lParam的

     

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

您传递的是文字Marshal.GetLastWin32Error(),其中1是预期的,并且您要将HWND的引用传递给int,其中COPYDATASTRUCT的引用是预期的。< / p>

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

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