.net form案例大全
WinForm 自动更新程序
自定义组件
跑马灯效果Label
TextBox横线样式及占位提示
监控变量值改变
Visual Studio 2022如何支持低版本.NET框架
Winform 支持高DPI的几种方式
C#实现程序在系统托盘显示图标及开机自启动
VS2022 工具箱中不显示 Devexpress控件的问题
进程间通信
两个exe程序之间通信
管道通信
日志写入到RichTextBox中展示
多线程访问WinForms控件的方法
多线程
线程锁与单多线程简单使用
本文档使用 MrDoc 发布
-
+
首页
两个exe程序之间通信
# Windows消息 ```java //第一个客户端的代码 /// <summary> /// 发送消息 /// </summary> /// <param name="hWnd">发送窗口句柄</param> /// <param name="msg">发送的消息类型</param> /// <param name="wParam">附加消息,根据msg参数区分使用</param> /// <param name="lParam">发送数据</param> /// <returns></returns> [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage(int hWnd, int msg, int wParam, ref COPYDATASTRUCT lParam); /// <summary> /// 查找窗口句柄 /// </summary> /// <param name="lpClassName">类名</param> /// <param name="lpWindowName">窗口标题</param> /// <returns></returns> [DllImport("User32.dll", EntryPoint = "FindWindow")] private static extern int FindWindow(string lpClassName, string lpWindowName); //当一个应用程序传递数据给另一个应用程序时发送此消息 const int WM_COPYDATA = 0x004A; private void btnSend_Click(object sender, EventArgs e) { //根据标题查找到句柄 int hWnd = FindWindow(null, "客户端2"); //组织数据 COPYDATASTRUCT cds; cds.dwData = 0; cds.cbData = System.Text.Encoding.Default.GetBytes(txtMsg.Text).Length + 1; cds.lpData = txtMsg.Text; //发送 SendMessage(hWnd, WM_COPYDATA, 0, ref cds); } public struct COPYDATASTRUCT { public int dwData;//若发送较小数据可用此字段传输 public int cbData;//发送数据的大小(以字节为单位) [MarshalAs(UnmanagedType.LPStr)] public string lpData;//发送数据 } ``` ```java //第二个客户端的代码 const int WM_COPYDATA = 0x004A; /// <summary> /// 重新DefWndProc方法,处理接收到的windows消息 /// </summary> /// <param name="m"></param> protected override void DefWndProc(ref System.Windows.Forms.Message m) { switch (m.Msg) { case WM_COPYDATA: COPYDATASTRUCT myStr = new COPYDATASTRUCT(); Type myType = myStr.GetType(); myStr = (COPYDATASTRUCT)m.GetLParam(myType); txtMsg.Text = myStr.lpData; break; default: base.DefWndProc(ref m); break; } } public struct COPYDATASTRUCT { public int dwData;//若发送较小数据可用此字段传输 public int cbData;//发送数据的大小(以字节为单位) [MarshalAs(UnmanagedType.LPStr)] public string lpData;//发送数据 } ```  # 简单的操作其他程序 首先要指明一点,此操作都是基于句柄的,但是现在有很多程序的控件都是自绘的,所以是没有句柄的。 实现功能: - 设置QQ窗口显示/隐藏(如果支持的化) - 设置QQ窗口最大化/最小化 - 自定义设置QQ窗口的标题 - 在输入控件中输入内容并回车 ```java #region 设置窗口标题 [DllImport("User32.dll")] private static extern int SendMessage(int hWnd, int msg, int wParam, String lParam); const int WM_SETTEXT = 0x000C; private void btnSetTitle_Click(object sender, EventArgs e) { int handle = int.Parse(txtHandle.Text, System.Globalization.NumberStyles.AllowHexSpecifier); SendMessage(handle, WM_SETTEXT, 0, txtTitle.Text); } #endregion #region 设置窗口显示隐藏 [DllImport("user32.dll")] public static extern bool SendMessage(int hWnd, int msg, Boolean wParam, int lParam); const int WM_SHOWWINDOW = 0x18; private void btnShow_Click(object sender, EventArgs e) { int handle = int.Parse(txtHandle.Text, System.Globalization.NumberStyles.AllowHexSpecifier); SendMessage(handle, WM_SHOWWINDOW, true, 0); } private void btnHide_Click(object sender, EventArgs e) { int handle = int.Parse(txtHandle.Text, System.Globalization.NumberStyles.AllowHexSpecifier); SendMessage(handle, WM_SHOWWINDOW, false, 0); } #endregion #region 输入内容 /// <summary> /// 查找子窗口句柄 /// </summary> /// <param name="hwndParent"></param> /// <param name="hwndChildAfter"></param> /// <param name="lpszClass"></param> /// <param name="lpszWindow"></param> /// <returns></returns> [DllImport("user32.dll")] private static extern int FindWindowEx(int hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); [DllImport("User32.dll")] private static extern int SendMessage(int hWnd, int msg, int wParam, int lParam); const int WM_CHAR = 0x102; private void button1_Click(object sender, EventArgs e) { int handle = int.Parse(txtHandle.Text, System.Globalization.NumberStyles.AllowHexSpecifier); int textHandle = FindWindowEx(handle, IntPtr.Zero, "Edit", ""); SendMessage(textHandle, WM_SETTEXT, 0, txtContent.Text); System.Threading.Thread.Sleep(1000); SendMessage(textHandle, WM_CHAR, 13, 0); } #endregion #region 最大最小化 const int SC_MINIMIZE = 0xF020; const int SC_MAXIMIZE = 0xF030; const int WM_SYSCOMMAND = 0x112; private void btnMax_Click(object sender, EventArgs e) { int handle = int.Parse(txtHandle.Text, System.Globalization.NumberStyles.AllowHexSpecifier); SendMessage(handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0); } private void btnMini_Click(object sender, EventArgs e) { int handle = int.Parse(txtHandle.Text, System.Globalization.NumberStyles.AllowHexSpecifier); SendMessage(handle, WM_SYSCOMMAND, SC_MINIMIZE, 0); } #endregion ```  以上句柄是我预先用SPY++抓好了的,也可以自己用FindWindow根据标题查找,由于QQ界面的渲染方式可能是动态的,所以这里设置标题实际是成功了的,可以看下图状态栏的名称。 还是上面写的问题,QQ没有输入框的句柄,所以输入这里我使用了记事本来实现效果,当然如果是winform程序,一般也是没问题的。更多的SendMessage的用法,大家也可以自行去百度。
孙端己
2024年10月11日 10:07
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码