C#高效实现Windows进程通信
开源 C# 快速开发(十五):进程与 Windows 消息机制
在 Windows 开发中,进程间通信(IPC)和消息机制是核心内容之一。通过 Windows 消息(Windows Messages)可以实现进程内或跨进程的通信,尤其适用于 UI 线程与后台线程的交互。C# 提供了多种方式处理 Windows 消息,以下内容将详细介绍相关技术与实现方法。
Windows 消息基础
Windows 消息是 Windows 操作系统中用于传递事件和命令的基本机制。常见的消息类型包括:
- WM_COMMAND:菜单或控件的命令通知。
- WM_PAINT:窗口需要重绘。
- WM_CLOSE:窗口关闭请求。
- WM_USER 和 WM_APP:用户自定义消息的起始标识符。
消息通常包含以下信息:
- 消息编号(Message ID):标识消息类型。
- WParam 和 LParam:附加参数,具体含义取决于消息类型。
在 C# 中处理 Windows 消息
C# 提供了多种方式处理 Windows 消息,以下为常见方法:
1. 重写 WndProc 方法
在 WinForms 中,可以通过重写控件的 WndProc 方法来处理消息:
protected override void WndProc(ref Message m) {
const int WM_NCHITTEST = 0x0084;
const int HTCLIENT = 1;
if (m.Msg == WM_NCHITTEST) {
m.Result = (IntPtr)HTCLIENT;
return;
}
base.WndProc(ref m);
}
2. 使用 MessageWindow 实现跨进程通信
通过 MessageWindow 可以创建一个隐藏窗口,用于接收消息:
public class MessageReceiver : NativeWindow {
public MessageReceiver() {
CreateHandle(new CreateParams());
}
protected override void WndProc(ref Message m) {
if (m.Msg == 0x0400) { // 自定义消息
Console.WriteLine("Received custom message");
}
base.WndProc(ref m);
}
}
3. 发送消息到其他窗口
使用 SendMessage 或 PostMessage API 发送消息:
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
// 示例:发送 WM_CLOSE 消息
SendMessage(targetHandle, 0x0010, IntPtr.Zero, IntPtr.Zero);
自定义消息与跨进程通信
自定义消息通常以 WM_APP 或 WM_USER 为基准:
const int WM_CUSTOM_MSG = 0x8000; // WM_APP + 0x0000
// 发送自定义消息
SendMessage(targetHandle, WM_CUSTOM_MSG, IntPtr.Zero, IntPtr.Zero);
跨进程通信时,需确保目标窗口句柄(HWND)已知,可以通过 FindWindow API 获取:
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
IntPtr targetHandle = FindWindow(null, "目标窗口标题");
if (targetHandle != IntPtr.Zero) {
SendMessage(targetHandle, WM_CUSTOM_MSG, IntPtr.Zero, IntPtr.Zero);
}
开源库推荐
以下开源库简化了 Windows 消息处理:
- WindowsAPICodePack:封装了常用 Windows API,包括消息处理。
- ManagedWinapi:提供对 Windows 消息的高级封装。
- Vanara:现代化的 Windows API 封装库,支持 .NET Core。
注意事项
- 线程安全性:
SendMessage是同步的,会阻塞调用线程;PostMessage是异步的。 - 64 位兼容性:在 64 位系统中,
WParam和LParam需确保指针大小正确。 - UWP 限制:UWP 应用无法直接使用传统 Windows 消息机制。
通过合理使用 Windows 消息机制,可以实现高效的进程通信和事件处理,尤其适用于需要与原生 Windows 功能交互的场景。
BbS.okapop113.sbs/PoSt/1122_334802.HtM
BbS.okapop114.sbs/PoSt/1122_416995.HtM
BbS.okapop115.sbs/PoSt/1122_038394.HtM
BbS.okapop116.sbs/PoSt/1122_618587.HtM
BbS.okapop117.sbs/PoSt/1122_811481.HtM
BbS.okapop118.sbs/PoSt/1122_772423.HtM
BbS.okapop119.sbs/PoSt/1122_975795.HtM
BbS.okapop120.sbs/PoSt/1122_026952.HtM
BbS.okapop121.sbs/PoSt/1122_457763.HtM
BbS.okapop122.sbs/PoSt/1122_027303.HtM
BbS.okapop113.sbs/PoSt/1122_450975.HtM
BbS.okapop114.sbs/PoSt/1122_105918.HtM
BbS.okapop115.sbs/PoSt/1122_859893.HtM
BbS.okapop116.sbs/PoSt/1122_382542.HtM
BbS.okapop117.sbs/PoSt/1122_307998.HtM
BbS.okapop118.sbs/PoSt/1122_291311.HtM
BbS.okapop119.sbs/PoSt/1122_975231.HtM
BbS.okapop120.sbs/PoSt/1122_687008.HtM
BbS.okapop121.sbs/PoSt/1122_024981.HtM
BbS.okapop122.sbs/PoSt/1122_802090.HtM
BbS.okapop113.sbs/PoSt/1122_912368.HtM
BbS.okapop114.sbs/PoSt/1122_730275.HtM
BbS.okapop115.sbs/PoSt/1122_744997.HtM
BbS.okapop116.sbs/PoSt/1122_417936.HtM
BbS.okapop117.sbs/PoSt/1122_441782.HtM
BbS.okapop118.sbs/PoSt/1122_904873.HtM
BbS.okapop119.sbs/PoSt/1122_901489.HtM
BbS.okapop120.sbs/PoSt/1122_693188.HtM
BbS.okapop121.sbs/PoSt/1122_572301.HtM
BbS.okapop122.sbs/PoSt/1122_018027.HtM
BbS.okapop113.sbs/PoSt/1122_931672.HtM
BbS.okapop114.sbs/PoSt/1122_112850.HtM
BbS.okapop115.sbs/PoSt/1122_706561.HtM
BbS.okapop116.sbs/PoSt/1122_595379.HtM
BbS.okapop117.sbs/PoSt/1122_513877.HtM
BbS.okapop118.sbs/PoSt/1122_209446.HtM
BbS.okapop119.sbs/PoSt/1122_520111.HtM
BbS.okapop120.sbs/PoSt/1122_956030.HtM
BbS.okapop121.sbs/PoSt/1122_465733.HtM
BbS.okapop122.sbs/PoSt/1122_330011.HtM
BbS.okapop113.sbs/PoSt/1122_967762.HtM
BbS.okapop114.sbs/PoSt/1122_107377.HtM
BbS.okapop115.sbs/PoSt/1122_564380.HtM
BbS.okapop116.sbs/PoSt/1122_203917.HtM
BbS.okapop117.sbs/PoSt/1122_228566.HtM
BbS.okapop118.sbs/PoSt/1122_507974.HtM
BbS.okapop119.sbs/PoSt/1122_482904.HtM
BbS.okapop120.sbs/PoSt/1122_759852.HtM
BbS.okapop121.sbs/PoSt/1122_349085.HtM
BbS.okapop122.sbs/PoSt/1122_432275.HtM
BbS.okapop113.sbs/PoSt/1122_801273.HtM
BbS.okapop114.sbs/PoSt/1122_512762.HtM
BbS.okapop115.sbs/PoSt/1122_521714.HtM
BbS.okapop116.sbs/PoSt/1122_355144.HtM
BbS.okapop117.sbs/PoSt/1122_618616.HtM
BbS.okapop118.sbs/PoSt/1122_746256.HtM
BbS.okapop119.sbs/PoSt/1122_154357.HtM
BbS.okapop120.sbs/PoSt/1122_297847.HtM
BbS.okapop121.sbs/PoSt/1122_390869.HtM
BbS.okapop122.sbs/PoSt/1122_385204.HtM
BbS.okapop113.sbs/PoSt/1122_181643.HtM
BbS.okapop114.sbs/PoSt/1122_840414.HtM
BbS.okapop115.sbs/PoSt/1122_372101.HtM
BbS.okapop116.sbs/PoSt/1122_615766.HtM
BbS.okapop117.sbs/PoSt/1122_199655.HtM
BbS.okapop118.sbs/PoSt/1122_427732.HtM
BbS.okapop119.sbs/PoSt/1122_776923.HtM
BbS.okapop120.sbs/PoSt/1122_782028.HtM
BbS.okapop121.sbs/PoSt/1122_481005.HtM
BbS.okapop122.sbs/PoSt/1122_129156.HtM
BbS.okapop113.sbs/PoSt/1122_019086.HtM
BbS.okapop114.sbs/PoSt/1122_935897.HtM
BbS.okapop115.sbs/PoSt/1122_902511.HtM
BbS.okapop116.sbs/PoSt/1122_985960.HtM
BbS.okapop117.sbs/PoSt/1122_033266.HtM
BbS.okapop118.sbs/PoSt/1122_702624.HtM
BbS.okapop119.sbs/PoSt/1122_001344.HtM
BbS.okapop120.sbs/PoSt/1122_924464.HtM
BbS.okapop121.sbs/PoSt/1122_816147.HtM
BbS.okapop122.sbs/PoSt/1122_825622.HtM
查看25道真题和解析