Control para obtener teclas de acceso rápido como la pestaña y el espacio
-
03-07-2019 - |
Pregunta
Tengo un cuadro de diálogo que permite a los usuarios configurar teclas de acceso rápido para su uso en un programa 3D en Windows. Estoy usando CHotKeyCtrl, que es bastante bueno, pero no maneja algunas teclas que a los usuarios les gustaría usar, específicamente, la pestaña y el espacio.
El manejo de las teclas de acceso rápido es lo suficientemente inteligente como para poder disparar esas teclas, solo necesito una IU para que se configuren. Un control similar a CHotKeyCtrl sería ideal, pero también se aprecian otras soluciones.
Solución
Una opción alternativa sería utilizar un control de edición estándar estándar con una función de enlace de mensaje.
Esto le permitiría interceptar los mensajes del teclado WM_KEYDOWN enviados a ese control de edición.
La función de enlace se vería así:
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;
}
El enlace se puede adjuntar al control de edición cuando el control de edición se enfoca de la siguiente manera:
//-- 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());
y se elimina cuando el control de edición cuando pierde se enfoca de la siguiente manera:
//-- remove a message hook
UnhookWindowsHookEx(MessageFilterHook);
Usando este enfoque, cada pulsación de tecla se enviará al gancho, siempre que el control de edición esté enfocado.