2020年8月26日星期三

C#.WinForm调用winapi SendMessage方法跨进程发消息

本文章主要用于做接口形式跨进程的使用。

额外提下:

发普通消息与此类同

1   public const int WM_SETTEXT = 12;2   public const int CB_SETCURSEL = 0X014D;3   [DllImport("user32.dll", EntryPoint = "SendMessage")]4   public static extern int SendMessage(int hwnd, int wMsg, int wParam, string lParam);5   //发送文本框6   SendMessage(对方文本框句柄, WM_SETTEXT , 0, "测试");7   //发送下拉框用于选择8   SendMessage(对方下拉框句柄, CB_SETCURSEL, 0, "下拉框文本");
发送到对方指定控件

介绍:

Windows Api 的 SendMessage 该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而和函数PostMessage不同,PostMessage是将一个消息寄送到一个线程的消息队列后就立即返回。

通俗:通过SendMessage函数 向指定窗口句柄 或 控件句柄发送消息,支持跨进程发消息。

C#方法的定义

 1   [DllImport("User32.dll", EntryPoint = "SendMessage")] 2   public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam); 3   [StructLayout(LayoutKind.Sequential)] 4   public struct COPYDATASTRUCT 5   { 6    public IntPtr dwData; 7    public int cbData; 8    [MarshalAs(UnmanagedType.LPStr)] 9    public string lpData;10   }
api的定义

举例:

0x004a消息号 尽量不要乱填,因为可能被占用或有大小限制。最好采用json放入lpdata里 json里做接口规则
1 COPYDATASTRUCT cds;//定义消息结构体2 cds.dwData = (IntPtr)0;3 cds.cbData = System.Text.Encoding.UTF8.GetBytes("测试").Length + 1;//字符串长度4 cds.lpData = "测试";//字符串5 SendMessage(Process.GetCurrentProcess().MainWindowHandle, 0x004a, 0, ref cds);//向自身进程的主窗体句柄发送消息
发送消息在窗体里 加入以下方法接收消息
 1   protected override void DefWndProc(ref Message m) 2   { 3    switch (m.Msg) 4    { 5     case 0x004a://消息号 6      COPYDATASTRUCT cds = new SystemTool.COPYDATASTRUCT(); 7      Type t = cds.GetType(); 8      cds = (COPYDATASTRUCT)m.GetLParam(t); 9      string receiveInfo = cds.lpData;//拿到字符串10      break;11     default:12      base.DefWndProc(ref m);13      break;14    }15   }
接收代码

 注:

SendMessage(Process.GetCurrentProcess().MainWindowHandle, 0x004a, 0, ref cds);

这里 Process.GetCurrentProcess().MainWindowHandle 如果发送给XX进程,MainWindowHandle这个句柄将是对方的主窗体,意思也就是说

情况一:如果对方Form只有1个AForm显示出来了,那么接收消息方法就要写在AForm里,

情况二:如果对方AForm里又弹出了个子窗体BForm,那么接收消息方法就要写在BForm里。

C#.WinForm调用winapi SendMessage方法跨进程发消息亚马逊常见问题全面解析鹰熊汇Wish平台公开课stylenanda成人类目这个亚马逊最赚钱的类目,应该如何运营?美商会负责人:美中贸易磋商已完成90%,两国"很有可能"达成协议新手入!亚马逊卖家账号注册及收取费用详解珠海白藤湖好玩吗?珠海灯笼沙水乡自驾游该怎么走?暑假去珠海亚马逊部落景区有什么好玩的么?

没有评论:

发表评论