User32.dll espone una funzione RegisterHotKey
, per registrare, beh, tasti di scelta rapida:
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool RegisterHotKey(IntPtr hWnd, IntPtr id, uint fsModifiers, uint vk);
Usando questa API, possiamo registrare i tasti di scelta rapida come Ctrl + R o qualunque combinazione di modificatore + chiave che vogliamo usare, e quindi possiamo gestire WM_HOTKEY
messaggi a esegui il comando dell'applicazione associato, quindi possiamo usare UnregisterHotKey
per sganciare la combinazione di tasti.
In Visual Studio, abbiamo tasti di scelta rapida "compositi", in 2 "accordi":
- Ctrl + R , Ctrl + R innesca refactor / rinomina
- Ctrl + R , Ctrl + M innesca refactor / extract method
Sto cercando di pensare a un buon modo di fare esattamente questo, e ho pensato a diversi approcci:
- Registra Ctrl + R come hotkey, quindi usa un hook a basso livello per catturare (e ingoiare) il prossimo tasto di pressione.
- Registra Ctrl + R come hotkey, quindi gestisci
WM_HOTKEY
messaggi registrando tutte le possibili 2 chiavi per quel tasto di scelta rapida; annullare la registrazione sul prossimo tasto di pressione. Questo ha il vantaggio di elaborare tutto comeWM_HOTKEY
di messaggi. - Non registrare nessun tasti di scelta rapida. Usa un hook a basso livello per catturare tutto, e in pratica implementa la logica di hotkey-manual manualmente.
Qual è l'approccio migliore e perché? Potrei imbattersi in problemi di stabilità se vado con il n. 2 e inizierò ad aggirare e ad agganciare continuamente cose? C'è un altro modo in cui non ho pensato? Come stanno facendo Visual Studio e ReSharper?