Windows 为什么要翻译信息
我试图理解“消息循环”。 这就是它的样子:Windows 为什么要翻译信息,windows,winapi,visual-c++,Windows,Winapi,Visual C++,我试图理解“消息循环”。 这就是它的样子: MSG msg = { }; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } 到目前为止,我很清楚(至少我希望如此)这个概念。当用户使用键盘和鼠标与windows应用程序交互时,这些事件将由相应的设备驱动程序转换为适当的消息,并发布到系统消息队列 操作系统从队列中逐个删除消息,并检查每
MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
到目前为止,我很清楚(至少我希望如此)这个概念。当用户使用键盘和鼠标与windows应用程序交互时,这些事件将由相应的设备驱动程序转换为适当的消息,并发布到系统消息队列
操作系统从队列中逐个删除消息,并检查每个消息,以将它们发送到负责创建目标窗口的各个应用程序的线程队列
现在在我的申请中
MSG msg;
GetMessage(&msg, NULL, 0, 0);
从特定于线程的消息队列中删除消息并填充消息结构
但是TranslateMessage
据说可以将虚拟击键转换为字符,并将其发回调用线程的消息队列
DispatchMessage
指示操作系统调用相应目标窗口的Windows过程
两个疑问:
1) TranslateMessage的确切功能是什么;是否只是将虚拟击键转换为字符消息(我假设虚拟击键是字母和数字以外的击键),如果字符消息被发回队列,循环是否会中断
2) 鼠标事件呢?它们是直接调度的吗?简而言之
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
加速器在这里很重要,也被称为“快捷键”。无论哪个窗口具有焦点,您的程序都希望响应它们。Like F1显示程序的帮助文件,无论哪个控件具有焦点。您不希望必须编写将每个控件窗口子类化以识别F1的代码
因此,如果这是一个快捷键,那么您不想调用TranslateMessage。如果该键恰好与键入键匹配,则该键不应生成WM_CHAR消息。这就是为什么这是一个单独的电话