win32 api编辑控件和键盘加速器

时间:2013-11-26 09:46:17

标签: c winapi keyboard

我正在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消息呢?

1 个答案:

答案 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消息定向到您想要的位置。