为什么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);
}
答案 0 :(得分:0)
您对SendMessage()
的声明是错误的。 wParam
应为UIntPtr
,lParam
应为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);
}