windows api 中的几个消息转换函数:
1、TranslateAccelerator
函数原型:
int TranslateAcceleratorW(
[in] HWND hWnd,
[in] HACCEL hAccTable,
[in] LPMSG lpMsg
);
当应用程序运行时,用户按下快捷键,这样就产生了一个按键消息,那么 Windows 是怎么样把它转化为快捷键响应的消息呢?这就需要使用 TranslateAccelerator 函数。 TranslateAccelerator 函数主要的作用就是把消息跟快捷键表(通过::LoadAccelerators函数加载到进程中)里定义的按键组合进行比较,如果发现有快捷键,就会把这个按键消息转换为 WM_COMMAND 或者 WM_SYSCOMMAND 消息给hWnd对应的窗口消息处理函数发送过去。然后将WM_COMMAND或WM_SYSCOMMAND消息直接送到相应的窗口处理过程。TranslateAccelerator直到窗口过程处理完消息后才返回。
2、IsDialogMessage
函数原型:
BOOL IsDialogMessageW(
[in] HWND hDlg,
[in] LPMSG lpMsg
);
IsDialogMessage不仅用来检查对话框消息的,当消息是给这个对话框的,则要转换并处理这个消息。更贴切的名字应该是TranslateDialogMessage。IsDialogMessage解释非模态对话框消息(虽然这个函数是针对非模式对话框设计的,但是你也可以在任何包含控件的窗口中使用,使窗口具备相同的键盘选择控件能力)。例如当按下tab时选择下一个控件或控件组,当按下down时选择控件组内的下一个控件。因为IsDialogMessage 函数要执行消息所有必要的消息转换和消息分发,IsDialogMessage函数处理的消息不必传送给TranslateMessage或 DispatchMessage函数处理。 IsDialogMessage函数把WM_GETDLGETDLGCODE发送到对话框应用程序,决定应该处理哪个键。 lsDialogMessage函数把DM_GETDEFID和DM_SETDEFID消息发送到窗口,获得默认按钮的ID号。
3、TranslateMessage
函数原型:
BOOL TranslateMessage(
[in] const MSG *lpMsg
);
当我们敲击键盘上的某个键时,系统将向窗口发送WM_KEYDOWN和WM_KEYUP 击键消息。这两个消息的附加参数( wParam和 lParam)包含的是 虚拟键代码和扫描码等信息。对于可显示字符的击键操作,TranslateMessage将按键消息转换为字符消息,如Shift+a 转换为大写A字符。并将转换后的新消息投递到调用线程的消息队列中。新增加的消息为WM_CHAR(该消息的wParam附加参数包含了字符的ASCII码)。TranslateMessage会发现消息里是否有字符键的消息,如果有字符键的消息,并发送WM_CHAR消息,如果没有就不会产生任何消息。例如,按下Shift 键,再按下 a键,然后释放a键,最后松开Shift键,将产生以下消息序列:
| 消息 | 键或代码 |
| WM_KEYDOWN | 虚拟键码VK_SHIFT |
| WM_KEYDOWN | A的虚拟键码 |
| WM_CHAR | “A”的字符代码 |
| WM_KEYUP | A的虚拟键码 |
| WM_KEYUP | 虚拟键码VK_SHIFT |
8145

被折叠的 条评论
为什么被折叠?



