【问题标题】:win32 api edit control and keyboard acceleratorwin32 api 编辑控件和键盘加速器
【发布时间】:2013-12-11 09:09:02
【问题描述】:

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

【问题讨论】:

    标签: c winapi keyboard


    【解决方案1】:

    TranslateAccelerator 的第一个参数记录为:

    要翻译其消息的窗口句柄。

    这是一种误导,并不完全正确。关于Processing WM_COMMAND messages (Using Keyboard Accelerators) 的部分更重要:

    当使用加速器时,在 TranslateAccelerator 函数中指定的窗口会收到 WM_COMMAND 或 WM_SYSCOMMAND 消息。

    要解决您的问题,请将对 TranslateAccelerator 的调用替换为以下内容:

    if (!TranslateAccelerator(hwndMain,HAccel,&Msg))
    

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

    【讨论】:

    • 谢谢汉斯。有用。我不敢相信答案是多么简单,我怎么会落入如此可恶的陷阱!
    • 感谢您为我节省了大量时间。
    • @AmbarChatterjee 您能否将此答案标记为已接受以保持记录整洁? (您还将获得一些声望点:))。谢谢!
    • 完成!我无法找到从灰色变为绿色以将答案标记为已接受的刻度线。
    猜你喜欢
    • 1970-01-01
    • 2011-06-15
    • 2014-02-16
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    相关资源
    最近更新 更多