Registrati tasti di scelta rapida in .NET - combinazione di tre / quattro tasti
-
13-10-2019 - |
Domanda
mi sono bloccato.
In questo momento, sto utilizzando il seguente codice di ascoltare tasti di scelta rapida:
[DllImport("user32.dll")]
public static extern bool RegisterHotKey(IntPtr hWnd,
int id, int fsModifiers, int vlc);
[DllImport("user32.dll")]
public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0312)
{
// whatever i need
}
base.WndProc(ref m);
}
e questa funzione per registrare hotkey:
Form1.RegisterHotKey(this.Handle, this.GetType().GetHashCode(), 0, (int)chr);
funziona perfettamente. la mia domanda è come faccio a registrare più tasti di scelta rapida, come la stessa combinazione, ad esempio:
- A + B + C + D
- ALT + SHIFT + B
- CTRL + ALT + MAIUSC + X
modifica: ho scoperto (come Zooba detto) come "decifrare", che è stato inviato hotkey ed ecco la soluzione:
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0312)
{
Keys key = (Keys)(((int)m.LParam >> 16) & 0xFFFF);
ModifierKeys modifier = (ModifierKeys)((int)m.LParam & 0xFFFF);
if ((modifier + "+" + key == "Alt+S"))
{
//do what ever I need.
}
}
base.WndProc(ref m);
}
Soluzione 2
Ho trovato la risposta. Invece di usare registerhotkey
, ho usato KeyState
e risolto tutti i miei problemi. Se qualcuno è interessato, è possibile andate qui ( backup archive.org )
Altri suggerimenti
Dalla documentazione per WM_HOTKEY :
lParam I specifica parola di ordine le chiavi che dovevano essere premuto in combinazione con la chiave specificata dalla parola di ordine superiore per generare il messaggio WM_HOTKEY. Questa parola può essere uno o più dei seguenti valori. La parola di ordine specifica il codice tasto virtuale del tasto di scelta rapida.
Quindi, si può leggere il membro LParam
di m
per determinare le chiavi che sono stati premuti (in alternativa, se si assegna identificatori più sensibili di quanto GetHashCode
è possibile controllare WParam
).
Il 'alta l'ordine delle parole' e 'parola di ordine' si riferisce a parti del intero (in realtà un IntPtr
) contenuta in LParam
, quindi sarà necessario per estrarre queste. La parola di ordine è i & 0xFFFF
, mentre la parola di ordine superiore è (i >> 16) & 0xFFFF
.
Per rilevare quale combinazione di tasti è stato premuto, controllare i bassi quattro bit della parola di ordine per i modificatori (shift, alt, controllo) e confronta la parola di ordine superiore contro il codice chiave virtuale - che per le lettere è uguale per il valore del carattere del capitale (per esempio, il codice tasto virtuale per la a è (int) 'a', ma non (int) 'a').
La tua combinazione di 'A + B + C + D' non è valido, in quanto tasti di scelta rapida WM_HOTKEY
supportano solo un singolo carattere. Sarà necessario allegare un hook di tastiera per rilevare quella combinazione da qualsiasi luogo (oi messaggi impugnatura se desideri solo rilevare che mentre l'applicazione è attiva).