2011-01-16 13 views
7

znalazłem ten mały kawałek kodu, aby zarejestrować skrótu:zarejestrować więcej niż jeden klawisz skrótu z 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'); 
    } 

działa idealnie, ale mój problem jest chcę użyć dwóch różnych skrótów. Wiem, że drugi parametr jest identyfikatorem, więc wyobrażam sobie, że mógłbym wprowadzić inny identyfikator i dodać nową instrukcję if w funkcji WndProc, ale nie jestem pewien, jak by to osiągnąć.

Krótko mówiąc, w jaki sposób utworzyć drugi skrót?

Dzięki,

+2

'GetHashCode()' jako ID jest podzielony na dwa sposoby. 1) Dwa typy mogą mieć ten sam skrót 2) Używa złego zasięgu. "Aplikacja musi określać wartość id w zakresie od 0x0000 do 0xBFFF. Udostępniona biblioteka DLL musi określać wartość z zakresu od 0xC000 do 0xFFFF (zakres zwracany przez funkcję GlobalAddAtom). Aby uniknąć konfliktów z identyfikatorami skrótów zdefiniowanymi przez inne udostępnione DLL, biblioteka DLL powinna korzystać z funkcji GlobalAddAtom w celu uzyskania identyfikatora skrótu. " – CodesInChaos

Odpowiedz

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

Nie używają GetHashCode() tutaj. Po prostu numeruj klawisze skrótów, zacznij od 0. Nie ma żadnego niebezpieczeństwa, że ​​identyfikatory będą pomieszane, a identyfikatory klawiszy są specyficzne dla każdego uchwytu. Otrzymasz id z powrotem w metodzie WndProc(). Użyj m.WParam.ToInt32(), aby uzyskać wartość:

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

Brakujący nawias zamykający w linii "Mbox.Show" - nie można edytować, ponieważ potrzebuję 6 edytowanych znaków ~. ~ – torno

Powiązane problemy