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:

  1. A + B + C + D
  2. ALT + SHIFT + B
  3. 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);
    }
È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top