Controllo per ottenere tasti di scelta rapida come scheda e spazio
-
03-07-2019 - |
Domanda
Ho una finestra di dialogo che consente agli utenti di impostare tasti di scelta rapida da utilizzare in un programma 3d su Windows. Sto usando CHotKeyCtrl, che è abbastanza buono, ma non gestisce alcuni tasti che gli utenti vorrebbero usare - in particolare, tab e spazio.
La gestione dei tasti di scelta rapida è abbastanza intelligente da poter sparare su quei tasti, ho solo bisogno di un'interfaccia utente per lasciarli impostati. Un controllo simile a CHotKeyCtrl sarebbe l'ideale, ma sono apprezzate anche altre soluzioni alternative.
Soluzione
Un'opzione alternativa sarebbe quella di utilizzare un controllo di modifica standard di scorta con una funzione di hook messaggio.
Ciò ti consentirebbe di intercettare i messaggi della tastiera WM_KEYDOWN inviati a quel controllo di modifica.
La funzione hook sarebbe simile a questa:
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;
}
L'hook può quindi essere collegato al controllo di modifica quando il controllo di modifica viene attivato come segue:
//-- 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());
e rimosso quando il controllo di modifica quando perde lo stato attivo come segue:
//-- remove a message hook
UnhookWindowsHookEx(MessageFilterHook);
Usando questo approccio, ogni pressione del tasto verrà inviata all'hook, a condizione che il controllo di modifica sia attivo.