【问题标题】:Control for getting hotkeys like tab and space控制获取热键,如制表符和空格
【发布时间】:2010-09-14 08:23:18
【问题描述】:

我有一个对话框,允许用户设置热键以在 Windows 上的 3d 程序中使用。我正在使用 CHotKeyCtrl,它非常好,但不处理用户想要使用的某些键 - 特别是制表符和空格。

热键处理足够智能,可以触发这些键,我只需要一个 UI 来设置它们。类似于 CHotKeyCtrl 的控件是理想的,但也可以使用其他解决方法。

【问题讨论】:

    标签: c++ mfc user-interface hotkeys


    【解决方案1】:

    一种解决方法是使用带有消息挂钩功能的标准编辑控件。

    这将允许您捕获发送到该编辑控件的键盘 WM_KEYDOWN 消息。

    钩子函数看起来像这样:

        LRESULT CALLBACK MessageHook(int code, WPARAM wParam, LPMSG lpMsg)
        {
          LRESULT lResult = 0;
    
          if ((code >= 0) && (code == MSGF_DIALOGBOX))
          {
            if (lpMsg->message == WM_KEYDOWN)
            {
              //-- process the key down message
              lResult = 1;
            }
          }
    
          // do default processing if required
          if (lResult == 0)
          {
            lResult = CallNextHookEx(MessageFilterHook, code, wParam, (LPARAM)lpMsg);
          }
    
          return lResult;
        }
    

    当编辑控件获得焦点时,挂钩可以附加到编辑控件,如下所示:

        //-- create an instance thunk for our hook callback
        FARPROC FilterProc = (FARPROC) MakeProcInstance((HOOKPROC)(MessageHook),
                                                        hInstance);
        //-- attach the message hook
        FilterHook = SetWindowsHookEx(WH_MSGFILTER, 
                                     (HOOKPROC)FilterProc, 
                                      hInstance, GetCurrentThreadId());
    

    当编辑控件失去焦点时移除如下:

        //-- remove a message hook
        UnhookWindowsHookEx(MessageFilterHook);
    

    使用这种方法,只要编辑控件具有焦点,每次按键都会发送到钩子。

    【讨论】:

    • 这看起来不错。我会看看我是否可以实现它并在有机会时将其发布回来。
    猜你喜欢
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 2019-02-15
    • 2020-09-01
    • 2010-09-09
    • 1970-01-01
    相关资源
    最近更新 更多