用于获取热键(如制表符和空格)的控件
时间:2020-03-06 14:56:31 来源:igfitidea点击:
我有一个对话框,允许用户设置Windows 3d程序中使用的热键。我正在使用CHotKeyCtrl,这非常好,但不能处理用户想使用的某些键,即制表符和空格。
热键处理足够智能,可以在这些键上触发,我只需要一个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);
使用这种方法,只要编辑控件具有焦点,每次按键都会发送到该钩子。