Qual è una buona strategia per registrare i tasti di scelta rapida in 2 passaggi?

2

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:

  1. Registra Ctrl + R come hotkey, quindi usa un hook a basso livello per catturare (e ingoiare) il prossimo tasto di pressione.
  2. 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 come WM_HOTKEY di messaggi.
  3. 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?

    
posta Mathieu Guindon 29.03.2016 - 03:19
fonte

1 risposta

1

Sembra che Visual Studio consenta F12 come tasto di scelta rapida, mentre RegisterHotKey non consente F12, quindi Visual Studio non sembra utilizzare RegisterHotKey.

Questo approccio utilizza GetAsyncKeyState per evitare RegisterHotKey senza diventa troppo basso e utilizza i delegati per gestire i tasti di scelta rapida. Non implementa gli accordi in 2 fasi, ma osservando il modo in cui cattura i modificatori, sembra che potrebbe essere espanso per gestire gli accordi.

    
risposta data 29.03.2016 - 05:23
fonte

Leggi altre domande sui tag