C#高效实现Windows进程通信

开源 C# 快速开发(十五):进程与 Windows 消息机制

在 Windows 开发中,进程间通信(IPC)和消息机制是核心内容之一。通过 Windows 消息(Windows Messages)可以实现进程内或跨进程的通信,尤其适用于 UI 线程与后台线程的交互。C# 提供了多种方式处理 Windows 消息,以下内容将详细介绍相关技术与实现方法。

Windows 消息基础

Windows 消息是 Windows 操作系统中用于传递事件和命令的基本机制。常见的消息类型包括:

  • WM_COMMAND:菜单或控件的命令通知。
  • WM_PAINT:窗口需要重绘。
  • WM_CLOSE:窗口关闭请求。
  • WM_USERWM_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. 发送消息到其他窗口

使用 SendMessagePostMessage 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_APPWM_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 位系统中,WParamLParam 需确保指针大小正确。
  • 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

#牛客AI配图神器#

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务