2013-03-14 21 views
15

Mam aplikację działającą w tle. Muszę wygenerować pewne zdarzenie za każdym razem, gdy użytkownik naciśnie w dowolnej chwili F12. Więc to, czego potrzebuję, aby uchwycić naciśnięcie klawisza. W mojej aplikacji, jeśli kiedykolwiek użytkownik zostanie naciśnięty, zostanie wykonane pewne zdarzenie. Nie rozumiem, jak to zrobić?Przechwytywanie naciśnięcia klawisza w tle

Czy ktoś ma pomysł, jak to zrobić?

N: B: Jest to aplikacja WinForm. Nie musi skupiać się na mojej formie. Moje główne okno może pozostać w zasobniku systemowym, ale nadal musi przechwytywać naciśnięcie klawisza.

+0

możliwe duplikat [obsługi naciśnij klawisz funkcyjny] (http://stackoverflow.com/questions/1707040/handling-function-key-press) –

+0

Jaki wniosek? Co to znaczy "biegać w tle?" Co to jest "zawsze" (na czym koncentruje się Twoja aplikacja)? –

+0

Czy używasz formularza, aby wykonać naciśnięcie klawisza? Czy to jest aplikacja konsolowa? –

Odpowiedz

34

Co chcesz to globalny skrót .

  1. przywozowe potrzebne biblioteki na szczycie swojej klasy:

    // DLL libraries used to manage hotkeys 
    [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); 
    
  2. dodać pole w swojej klasie, które będą punktem odniesienia dla skrótu w kodzie:

    const int MYACTION_HOTKEY_ID = 1; 
    
  3. Zarejestruj klawisz skrótu (na przykład w konstruktorze formularza Windows):

    // Modifier keys codes: Alt = 1, Ctrl = 2, Shift = 4, Win = 8 
    // Compute the addition of each combination of the keys you want to be pressed 
    // ALT+CTRL = 1 + 2 = 3 , CTRL+SHIFT = 2 + 4 = 6... 
    RegisterHotKey(this.Handle, MYACTION_HOTKEY_ID, 6, (int) Keys.F12); 
    
  4. Uchwyt wpisywanych klawiszy, dodając następującą metodę w swojej klasie:

    protected override void WndProc(ref Message m) { 
        if (m.Msg == 0x0312 && m.WParam.ToInt32() == MYACTION_HOTKEY_ID) { 
         // My hotkey has been typed 
    
         // Do what you want here 
         // ... 
        } 
        base.WndProc(ref m); 
    } 
    
+0

Na marginesie, nie jestem wielkim fanem globalnych skrótów klawiszowych - myślę, że są potencjalnie "niebezpieczni". Co jeśli dwie aplikacje zarejestrowały ten sam klucz? Może to mieć nieoczekiwane konsekwencje, chyba że zostanie potraktowane bardzo ostrożnie. I nawet jeśli obchodzisz się ostrożnie, nic nie mówi, że druga aplikacja robi to samo. Coś jak bycie świetnym kierowcą, ale martwienie się o innych kierowców na drodze. –

+0

będzie działać, jeśli mój formularz nie jest w centrum uwagi? – DarkenShooter

+0

@ DarkenShooter: Tak. – Otiel

6

Jeżeli masz problem z uruchomieniem Otiel za rozwiązanie:

  1. Trzeba to:

    using System.Runtime.InteropServices; //required for dll import 
    
  2. Kolejna wątpliwość dla początkujących jak ja: „top klasy” naprawdę znaczy szczyt swojej klasie tak (nie obszaru nazw lub konstruktor):

    public partial class Form1 : Form 
    { 
    
        [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); 
    
  3. Nie trzeba dodawać user32.dll jako odniesienie do projekt. WinForm zawsze automatycznie ładuje tę bibliotekę DLL.

Powiązane problemy