2011-01-16 9 views
7

Ho trovato questo piccolo pezzo di codice per registrare un tasto di scelta rapida:Registrati più di un tasto di scelta rapida con RegisterHotKey

[DllImport("user32.dll")] 
    public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc); 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x0312) 
      MessageBox.Show("Hotkey pressed"); 
     base.WndProc(ref m); 
    } 

    public FormMain() 
    { 
     InitializeComponent(); 
     //Alt + A 
     RegisterHotKey(this.Handle, this.GetType().GetHashCode(), 1, (int)'A'); 
    } 

Funziona perfettamente, ma il mio problema è che voglio usare due collegamenti diversi. So che il secondo parametro è l'id, quindi immagino di poter creare un ID diverso e aggiungere una nuova istruzione if nella funzione WndProc ma non sono sicuro di come procedere.

In breve, come dovrei fare per creare una seconda scorciatoia?

Grazie,

+2

'GetHashCode()' come ID è rotto in due modi. 1) Due tipi possono avere lo stesso hash 2) Utilizza l'intervallo sbagliato. "Un'applicazione deve specificare un valore id nell'intervallo da 0x0000 a 0xBFFF. Una DLL condivisa deve specificare un valore nell'intervallo 0xC000 tramite 0xFFFF (l'intervallo restituito dalla funzione GlobalAddAtom). Per evitare conflitti con identificatori di tasti di scelta rapida definiti da altri condivisi DLL, una DLL dovrebbe utilizzare la funzione GlobalAddAtom per ottenere l'identificatore della chiave di scelta rapida. " – CodesInChaos

risposta

15
RegisterHotKey(this.Handle, this.GetType().GetHashCode(), 1, (int)'A') 

non uso GetHashCode() qui. È sufficiente numerare i tasti di scelta rapida, iniziare da 0. Non c'è alcun pericolo che gli ID vengano mescolati, gli ID di hot key sono specifici per ogni Handle. Otterrai l'ID nel metodo WndProc(). Utilizzare m.WParam.ToInt32() per ottenere il valore:

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == 0x0312) { // Trap WM_HOTKEY 
     int id = m.WParam.ToInt32(); 
     MessageBox.Show(string.Format("Hotkey #{0} pressed", id)); 
    } 
    base.WndProc(ref m); 
} 
+0

Manca la parentesi di chiusura nella riga "Mbox.Show" - impossibile modificare poiché ho bisogno di 6 caratteri modificati ~. ~ – torno

Problemi correlati