WINDOWS自定义消息范围

WINDOWS自定义消息WM_USER和WM_APP

WM_USER常量是Windows帮助应用程序定义私有窗口类里的私有消息,通常使用WM_USER+一个整数值,但总值不能超过0x7FFF。

#define WM_USER       0x0400                  -->1024

WM_APP常量是Windows帮助应用程序定义私有消息,通常使用WM_APP+一个整数值,但总值不能超过0xBFFF。

#define WM_APP       0x8000                    -->32768

 这两个都定义在WinUser.h中。

 

范围                                  表示

0 ~ WM_USER–1               操作系统保留的消息。

WM_USER ~ 0x7FFF         私有窗口类用的整数型消息。 

WM_APP ~ 0xBFFF           应用程序用的消息。

0xC000 ~ 0xFFFF              应用程序用的字符串消息。

0xFFFF ~                          操作系统保留的消息。

 

MFC在afxres.h中预定义了一些常用的控制条

#define AFX_IDW_TOOLBAR                     0xE800 // main Toolbar for window

#define AFX_IDW_STATUS_BAR               0xE801 // Status bar window

#define AFX_IDW_PREVIEW_BAR             0xE802 // PrintPreview Dialog Bar

#define AFX_IDW_RESIZE_BAR                0xE803 // OLE in-place resize bar

#define AFX_IDW_REBAR                         0xE804 // COMCTL32 "rebar" Bar

#define AFX_IDW_DIALOGBAR                 0xE805 // CDialogBar

 

转自:http://hi.baidu.com/luodx1021/item/1fd9a030bc40bdca1b9696a2

<think>我们正在查询Windows自定义消息范围。根据引用内容,我们得知: - 系统定义消息范围是0x0000到0x03FF(即0到WM_USER-1)。 - 用户自定义消息范围从0x0400(即WM_USER)到0x7FFF(引用[1]中提到0x0400到0x7FFF是为用户保留的)。 另外,引用[3]也提到了WM_USER消息(虽然标注已过时)和WM_APP消息,以及注册窗口消息。注册窗口消息可以保证全局唯一,通常使用RegisterWindowMessage函数,其范围在0xC000到0xFFFF之间。 总结: 1. 用户自定义消息的第一种方式:使用WM_USER到0x7FFF的范围。WM_USER定义为0x0400,所以范围是0x0400 (1024) 到 0x7FFF (32767)。 2. 应用程序全局消息(使用RegisterWindowMessage注册):范围从0xC000 (49152) 到 0xFFFF (65535)。这种消息在系统中是唯一的,不同应用程序注册相同的字符串会得到相同的消息值,因此适合进程间通信。 注意:引用[1]提到消息范围为0x0000到0xFFFF(0-65535),所以自定义消息不能超出这个范围。 因此,回答如下: 在Windows系统中,自定义消息范围分为两个区域: 1. **应用程序私有消息(WM_USER区域)**: - 范围:`WM_USER` (0x0400) 到 0x7FFF(即1024到32767) - 说明:此范围内的消息由应用程序内部使用,不同应用程序可以重复使用相同的消息值而不会冲突,但仅限于同一应用程序内。 2. **全局注册消息(RegisterWindowMessage区域)**: - 范围:0xC000 到 0xFFFF(即49152到65535) - 说明:通过`RegisterWindowMessage`函数注册的消息。该函数接收一个字符串参数,系统会为这个字符串生成一个唯一的消息ID。如果两个应用程序注册相同的字符串,将返回相同的消息ID,因此适合跨进程通信[^3]。 需要避免使用系统消息范围(0x0000到0x03FF)和未定义区域(0x8000到0xBFFF)。 补充示例代码(自定义消息处理): 根据引用[2],在窗口过程中处理自定义消息: ```cpp #define WM_MY_MESSAGE (WM_USER + 100) // 在WM_USER范围内定义 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_MY_MESSAGE: // 处理自定义消息 printf("Received WM_MY_MESSAGE with parameters: %d, %d\n", wParam, lParam); return 0; // ... 其他消息处理 } return DefWindowProc(hwnd, uMsg, wParam, lParam); } ``` 对于跨进程通信,推荐使用`RegisterWindowMessage`或`WM_COPYDATA`(引用[3]和[4]): ```cpp // 注册全局消息 UINT WM_GLOBAL_MESSAGE = RegisterWindowMessage(TEXT("MyGlobalMessage")); // 发送消息 PostMessage(hWndTarget, WM_GLOBAL_MESSAGE, 0, 0); ``` 注意事项: - 使用`WM_USER`定义的消息仅在同一进程内有效,跨进程发送可能因接收方未定义相同消息而无法处理。 - 使用`RegisterWindowMessage`注册的消息ID是动态分配的,因此需要用变量保存,不可硬编码。 相关问题: 1. 如何通过自定义消息实现跨进程通信? 2. 使用`RegisterWindowMessage`注册消息时需要注意什么? 3. 在Windows中,消息处理函数如何安全地处理自定义消息? </think>### Windows自定义消息范围详解 根据引用内容,Windows自定义消息范围可分为三个主要区域: 1. **WM_USER 消息范围** - 范围:`0x0400` (WM_USER) 到 `0x7FFF` (32767) - 特性: - 应用程序私有范围(每个应用独立) - 通过`#define`宏定义使用,例如: ```cpp #define WM_MY_MESSAGE (WM_USER + 100) // 0x0400 + 100 = 0x0464 ``` - 仅限同一进程内通信[^1][^2] 2. **WM_APP 消息范围** - 范围:`0x8000` (32768) 到 `0xBFFF` (49151) - 特性: - 新版替代WM_USER消息范围 - 允许多模块共享(同一进程内) - 定义示例: ```cpp #define WM_APP_MESSAGE (WM_APP + 200) ``` 3. **注册窗口消息范围** - 范围:`0xC000` (49152) 到 `0xFFFF` (65535) - 特性: - 通过`RegisterWindowMessage()`注册 - 全局唯一(跨进程有效) - 使用字符串标识符保证唯一性[^3]: ```cpp UINT WM_CROSS_PROCESS = RegisterWindowMessage(L"MyAppMessage"); ``` ### 关键区分(图示) ``` 0x0000 ────────┬──────────────┬──────────────┬───────────▶ 0xFFFF │ │ │ │ 系统消息 WM_USER范围 WM_APP范围 注册消息范围 (0-0x03FF) (0x0400-7FFF) (0x8000-BFFF) (0xC000-FFFF) │ │ │ 同一进程内 多模块共享 跨进程通信 ``` ### 使用注意事项 1. **避免冲突** 永远不要使用`0x0000-0x03FF`的系统保留区[^1] 2. **跨进程通信** 优先使用`RegisterWindowMessage`或`WM_COPYDATA`[^3][^4] 3. **消息处理示例** ```cpp // 接收端处理自定义消息 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_MY_MESSAGE: // WM_USER范围消息 printf("收到消息参数: %d, %d\n", wParam, lParam); return 1; // 返回值给发送方 ... } return DefWindowProc(hWnd, msg, wParam, lParam); } [^2] ``` > 重要原则: > - **WM_USER**:同一EXE文件内通信 > - **WM_APP**:同一进程内多DLL通信 > - **注册消息**:跨进程/全局通信
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值