Windows自定义消息ID

本文详细解释了Windows消息处理中WM_USER、WM_APP等消息范围的用途及应用建议,包括系统保留消息、私有窗口类消息及应用程序自定义消息的具体含义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WM_USER 到 0x7FFF 是为私有窗口类保留的。你可以将这个范围认为是在特定的窗体类中有意义的专用消息。
想要定义其自己消息的应用程序应该使用 WM_APP。

WM_APP 是确保不会与系统(WM_CREATE 等等)或类/特定控件消息如 DM_GETDEFID 相冲突的


Message Ranges in Windows

0 - (WM_USER-1) 系统使用的保留消息.如:WM_CREATE 和 WM_SCROLL.

WM_USER - 0x7FFF 私有窗口类使用的整型消息.如:DM_GETDEFID (对话框), TB_ENABLEBUTTON (工具栏),和 PBM_SETRANGE (进度条).

WM_APP - 0xBFFF 应用程序使用的消息.

0xC000 - 0xFFFF 应用程序使用的字符串消息(RegisterWindowMessage). > 0xFFFF Windows 保留在将来使用.

转载于:https://www.cnblogs.com/mixiyou/archive/2009/12/28/1634479.html

### C# 发送 Windows 自定义消息 在 C# 中,可以通过调用 Win32 API 来实现向窗口发送自定义消息的功能。这通常涉及使用 `SendMessage` 或 `PostMessage` 函数来传递消息到目标窗口句柄 (HWND)。为了创建并发送自定义消息,可以利用 `WM_USER` 或更高范围的消息 ID 值作为基础。 以下是具体实现方式: #### 使用 P/Invoke 调用 SendMessage 通过平台调用服务(P/Invoke),可以从托管代码中访问未托管的函数库。下面是一个简单的示例,展示如何注册和发送自定义消息。 ```csharp using System; using System.Runtime.InteropServices; class Program { // 定义常量 WM_USER 和自定义消息 ID public const int WM_USER = 0x0400; [DllImport("User32.dll", CharSet = CharSet.Auto)] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); /// <summary> /// 注册一个唯一的自定义消息ID /// </summary> /// <returns>返回分配的唯一消息ID</returns> private static uint RegisterCustomMessage() { return unchecked((uint)(WM_USER + 1)); // 创建一个新的自定义消息ID } static void Main(string[] args) { try { // 获取目标窗口句柄 (这里假设已知目标窗口句柄) IntPtr targetWindowHandle = new IntPtr(0x12345); // 替换为目标窗口的实际句柄 // 注册自定义消息 uint customMessageId = RegisterCustomMessage(); Console.WriteLine($"Sending Custom Message with ID: {customMessageId}"); // 构造参数 IntPtr wParamValue = new IntPtr(1); IntPtr lParamValue = new IntPtr(987654321); // 向指定窗口发送自定义消息 IntPtr result = SendMessage(targetWindowHandle, customMessageId, wParamValue, lParamValue); if (result != null && !result.Equals(IntPtr.Zero)) Console.WriteLine("Message sent successfully."); else Console.WriteLine("Failed to send message."); } catch (Exception ex) { Console.WriteLine($"Error occurred: {ex.Message}"); } } } ``` 此代码片段展示了如何定义、注册以及发送一条自定义消息至特定窗口的过程[^2]。其中需要注意的是替换掉占位符变量 `targetWindowHandle` 的实际值以便指向正确的接收方窗口实例。 另外,在某些情况下可能还需要考虑线程同步问题或者异步消息队列管理等问题,则可选用 `PostMessage` 方法代替 `SendMessage` 进行非阻塞操作[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值