1.引入window的SendMessage方法
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, ref NativeHelpers.COPYDATASTRUCT lParam);
其中NativeHelpers.COPYDATASTRUCT是一个struct,字段如下:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
2.定义方法来调用SendMessage方法
// msg 为传递的消息类型,dicCmd是要传递的参数
public void SendMsg(int msg, Dictionary<String, Object> dicCmd)
{
try
{
String json = JsonHelper.ToJson(dicCmd);
NativeHelpers.COPYDATASTRUCT copydata = new NativeHelpers.COPYDATASTRUCT();
copydata.dwData = (IntPtr)msg;
copydata.lpData = json;
copydata.cbData = Encoding.Default.GetBytes(json).Length + 1;
SendMessage(GetSmartMeetingMsgWnd(), (int)NativeHelpers.WinMsg.WM_COPYDATA, 0, ref copydata);
}
catch
{
}
}
Dictionary<string, object> keyValues = new Dictionary<string, object>
{
{ "param", param}
};
// 这里传递的值是 0x004A
SendMsg((int)NativeHelpers.WinMsg.WM_COPYDATA, keyValues);
// 此方法获取指定窗口的句柄
static IntPtr GetSmartMeetingMsgWnd()
{
IntPtr hMsgWnd = NativeHelpers.FindWindow(null, @"7BE8BEB0-5B6B-411A-B159-12580F855C0D");
return hMsgWnd;
}
到这里window消息已经发送成功 ,下面来看消息接收端
3 window消息接收端
1.重写 OnSourceInitialized 方法
protected override void OnSourceInitialized(EventArgs e)
{
System.Windows.Interop.HwndSource source = System.Windows.Interop.HwndSource.FromHwnd(new System.Windows.Interop.WindowInteropHelper(this).Handle);
if (source != null) source.AddHook(WndProc);
base.OnSourceInitialized(e);
}
// 处理window消息的事件
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
// Handle messages...
DealWindowsMsg(msg, lParam);
return IntPtr.Zero;
}
private async void DealWindowsMsg(int type, IntPtr param)
{
try
{
switch (type)
{
case ExecuteScript: //这里的值与发送端的msg对应来处理响应的逻辑
//处理对应的逻辑
break;
}
}
catch (Exception ex)
{
Throw;
}
}