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

Amb*_*jee 6 c keyboard winapi

我在win32 api中编写了一个简单的记事本编辑器(定制以适应一些额外的功能).编辑控件填满应用程序区域并始终关注焦点.我还需要处理一些键盘命令,如Ctl-S.所以我用通常的方式使用键盘加速器表来定义Ctl-S键,在我的消息循环中我有TranslateAccelerator

while (GetMessage(&Msg,NULL,0,0)>0)
   {
   if (!TranslateAccelerator(Msg.hwnd,HAccel,&Msg))
      { TranslateMessage(&Msg); DispatchMessage(&Msg); }
   }
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,由于编辑窗口始终具有焦点,当用户键入Ctl-S时,我根本不会收到WM_COMMAND消息.(我知道wParam的HIWORD对于键盘加速器会变为1,但这不是问题).

 case WM_COMMAND:
      switch (LOWORD(wParam))
         {
         ...
         case ID_CTL_S_PRESSED: {My code here} break;
         ...
         }
Run Code Online (Sandbox Code Playgroud)

如果我尝试没有编辑控件的代码,那么我确实得到上面的WM_COMMAND消息.那么当编辑控件始终具有焦点时,如何获取键盘加速器的WM_COMMAND消息呢?

IIn*_*ble 11

第一个参数TranslateAccelerator记录为:

窗口的句柄,其消息将被翻译.

这是误导性的,并不完全正确.有关处理WM_COMMAND消息(使用键盘加速器)的部分更重要:

使用加速器时,TranslateAccelerator函数中指定的窗口将收到WM_COMMAND或WM_SYSCOMMAND消息.

要解决您的问题,请将呼叫替换TranslateAccelerator为以下内容:

if (!TranslateAccelerator(hwndMain,HAccel,&Msg))
Run Code Online (Sandbox Code Playgroud)

Msg.hwnd将窗口句柄替换为主窗口会将WM_COMMAND消息定向到您想要的位置.

  • 在Win32应用程序的自动生成的VS代码中令人讨厌的陷阱. (2认同)