使用Window的SendMessage进行进程间通信

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;
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值