/ / Come posso impedire a RegisterHotKey di bloccare la chiave per altre applicazioni? - c ++, winapi, registerhotkey

Come posso impedire a RegisterHotKey di bloccare la chiave per altre applicazioni? - c ++, winapi, registerhotkey

Sto scrivendo un'applicazione win32 che deve essere eseguitaprendere tasti di scelta rapida mentre non è a fuoco (viene eseguito in background senza disegnare una finestra). Uso RegisterHotKey per assegnare alcune chiavi, ma questo blocca il resto per ogni altro processo. Ad esempio, assegno il tasto "c" e quando lo preme nel blocco note non accade nulla.

risposte:

2 per risposta № 1

RegisterHotKey() registra i tasti di scelta rapida globali. I tasti di scelta rapida vengono elaborati prima dell'elaborazione normale dell'input da tastiera, il che significa che se si registra un tasto di scelta rapida con successo, premendo quel tasto si otterrà il messaggio di hotkey piuttosto che l'app con focus che diventa normale WM_KEYDOWN/WM_CHAR messaggi. Hai bloccato in modo efficace altre app dal vedere quel tasto premuto.

Questo è di design.

Ovviamente la soluzione per evitare scontri come te descrive è non registra un tasto di scelta rapida che altre applicazioni potrebbero utilizzare. Se si registra C senza qualificatori come hotkey, nessun altro programma vedrà il tasto C premuto. Invece dovresti usare qualificatori come Ctrl / Shift / Alt per evitare che il tuo tasto rapido interferisca con il normale uso della tastiera.

Non c'è modo di registrare un hotkey globale salvo che qualche altro programma è attivo. Se vuoi raggiungere la situazione in cui, ad esempio, il tuo tasto di scelta rapida funziona mentre il desktop è attivo, ma non c'è nient'altro, puoi usare un hook del messaggio per iniettare il codice nel processo del desktop (tramite SetWindowsHookEx()) e intercetta le pressioni dei tasti in questo modo. Ma non puoi farlo con RegisterHotKey().


0 per risposta № 2
GetAsyncKeyState()

può essere usato per determinare se alcuni tasti vengono premuti, anche quando il programma è in esecuzione in background.