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

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

有帮助吗?

解决方案

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

这将允许您捕获发送到该编辑控件的键盘 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);

使用此方法,只要编辑控件具有焦点,每个按键都将被发送到挂钩。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top