How do I manually toggle the NumLock Key with C# in WPF?

Solution 1:

Here is a class (with a library) that can do this for you. the library does much more, so it's maybe a bit overkill to use just for this. The approach uses the keybd_event function using pinvoke:

// Simulate a key press
Interop.keybd_event((byte)virtualKey,
    0x45,
    Interop.KEYEVENTF_EXTENDEDKEY | 0,
    IntPtr.Zero);

// Simulate a key release
    Interop.keybd_event((byte)virtualKey,
    0x45,
    Interop.KEYEVENTF_EXTENDEDKEY | Interop.KEYEVENTF_KEYUP,
    IntPtr.Zero);

Pressing and releasing the button changes the state of the LED. virtualKey is one of the VK_ constants.

Here are the declarations:

internal partial class Interop
{
    public static int VK_NUMLOCK = 0x90;
    public static int VK_SCROLL = 0x91;
    public static int VK_CAPITAL = 0x14;
    public static int KEYEVENTF_EXTENDEDKEY = 0x0001; // If specified, the scan code was preceded by a prefix byte having the value 0xE0 (224).
    public static int KEYEVENTF_KEYUP = 0x0002; // If specified, the key is being released. If not specified, the key is being depressed.

    [DllImport("User32.dll", SetLastError = true)]
    public static extern void keybd_event(
        byte bVk,
        byte bScan,
        int dwFlags,
        IntPtr dwExtraInfo);

    [DllImport("User32.dll", SetLastError = true)]
    public static extern short GetKeyState(int nVirtKey);

    [DllImport("User32.dll", SetLastError = true)]
    public static extern short GetAsyncKeyState(int vKey);
}