我正在win32 api中编写一个简单的记事本编辑器(定制以适应一些额外的功能)。编辑控件填满应用程序区域并始终关注焦点。我还需要处理一些键盘命令,如Ctl-S。所以我用通常的方式使用键盘加速器表来定义Ctl-S键,在我的消息循环中我有TranslateAccelerator
while (GetMessage(&Msg,NULL,0,0)>0)
{
if (!TranslateAccelerator(Msg.hwnd,HAccel,&Msg))
{ TranslateMessage(&Msg); DispatchMessage(&Msg); }
}
现在我的问题是,由于编辑窗口始终具有焦点,当用户键入Ctl-S时,我根本不会收到WM_COMMAND消息。 (我知道wParam的HIWORD对于键盘加速器会变为1,但这不是问题。)
case WM_COMMAND:
switch (LOWORD(wParam))
{
...
case ID_CTL_S_PRESSED: {My code here} break;
...
}
如果我尝试没有编辑控件的代码,那么我确实得到上面的WM_COMMAND消息。那么当编辑控件始终具有焦点时,如何获取键盘加速器的WM_COMMAND消息呢?
答案 0 :(得分:11)
TranslateAccelerator
的第一个参数记录为:
要翻译其消息的窗口句柄。
这是误导性的,并不完全正确。关于Processing WM_COMMAND messages (Using Keyboard Accelerators)的部分更重要:
使用加速器时,TranslateAccelerator函数中指定的窗口会收到WM_COMMAND或WM_SYSCOMMAND消息。
要解决您的问题,请使用以下内容替换TranslateAccelerator
的来电:
if (!TranslateAccelerator(hwndMain,HAccel,&Msg))
将Msg.hwnd
替换为主窗口的窗口句柄会将WM_COMMAND
消息定向到您想要的位置。