Monitoring keyboard activity in C# while my application is in the background Monitoring keyboard activity in C# while my application is in the background windows windows

Monitoring keyboard activity in C# while my application is in the background


You'll need to use Window Hooks:

Low-Level Keyboard Hook in C#

But beware, Windows security, may be protecting us from doing what you want!


Microsoft tells you How to: Handle Keyboard Input at the Form Level. As long as you handle the same event(s) this works for any non web application.

You should also take a look at the other questions here on SO, such as Handling Input from a Keyboard Wedge


You can monitor keyboard and mouse activity in the background with the Nuget package MouseKeyHook (GitHub).

This code detects when a key is pressed:

    private IKeyboardMouseEvents _globalHook;    private void Subscribe()    {        if (_globalHook == null)        {            // Note: for the application hook, use the Hook.AppEvents() instead            _globalHook = Hook.GlobalEvents();            _globalHook.KeyPress += GlobalHookKeyPress;        }    }    private static void GlobalHookKeyPress(object sender, KeyPressEventArgs e)    {        Console.WriteLine("KeyPress: \t{0}", e.KeyChar);    }    private void Unsubscribe()    {        if (_globalHook != null)        {            _globalHook.KeyPress -= GlobalHookKeyPress;            _globalHook.Dispose();        }    }

You will need to call Subscribe() to start listening, and Unsubscribe() to stop listening. Obviously you need to modify GlobalHookKeyPress() to do useful work.

I needed this functionality in order to write a utility which will turn on the keyboard backlight on a Lenovo Thinkpad when any key is pressed, including CTRL (which KeyPress doesn't catch). For this purpose, I had to monitor for key down instead. The code is the same except we attach to a different event...

    _globalHook.KeyDown += GlobalHookOnKeyDown;

and the event handler signature is different:

    private static void GlobalHookOnKeyDown(object sender, KeyEventArgs e)    {        Console.WriteLine("KeyDown: \t{0}", e.KeyCode);    }

The library can also detect specific key combinations and sequences. For example:

    Hook.GlobalEvents().OnCombination(new Dictionary<Combination, Action>    {        { Combination.TriggeredBy(Keys.A).Control(), () => { Console.WriteLine("You Pressed CTRL+A"); } },        { Combination.FromString("Shift+Alt+Enter"), () => { Console.WriteLine("You Pressed FULL SCREEN"); } }    });