Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Capture a keyboard keypress in the background

Tags:

I have a application that runs in the background. I have to generate some event whenever a user press F12 at anytime. So what I need that to capture a key-press. In my application, if any time a user press F10 some event will be performed. I don't understand how to do that?

Have anyone any idea how to do that?

N:B: It is a winforms application. It doesn't need to have focus my form. My main window may remain in system tray but still it have to capture the keypress.

like image 693
ImonBayazid Avatar asked Mar 14 '13 15:03

ImonBayazid


2 Answers

What you want is a global hotkey.

  1. Import needed libraries at the top of your class:

    // 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. Add a field in your class that will be a reference for the hotkey in your code:

    const int MYACTION_HOTKEY_ID = 1; 
  3. Register the hotkey (in the constructor of your Windows Form for instance):

    // 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. Handle the typed keys by adding the following method in your class:

    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); } 
like image 200
Otiel Avatar answered Nov 11 '22 09:11

Otiel


In case you have problem running Otiel's solution:

  1. You need to include:

     using System.Runtime.InteropServices; //required for dll import 
  2. Another doubt for newbies like me: "top of the class" really means top of your class like this (not namespace or constructor):

    public partial class Form1 : Form {     [DllImport("user32.dll")]     public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifers, int vlc);      [DllImport("user32.dll")]     public static extern bool UnregisterHotKey(IntPtr hWnd, int id); } 
  3. You don't need to add user32.dll as reference to the project. WinForms always load this dll automatically.

like image 30
baron_bartek Avatar answered Nov 11 '22 08:11

baron_bartek