You will need P / Invoke SendInput . This is somewhat related:
void ToggleNumLock() { var inputSequence = new INPUT[2];
Here are the relevant definitions:
using System.Runtime.InteropServices; [DllImport("user32.dll")] static extern uint SendInput(UInt32 nInputs, INPUT[] pInputs, int cbSize); [DllImport("user32.dll")] static extern short GetKeyState(int keyCode); [StructLayout(LayoutKind.Sequential)] public struct INPUT { internal uint type; internal KEYBDINPUT U; internal static int Size { get { return Marshal.SizeOf(typeof(INPUT)); } } } [StructLayout(LayoutKind.Sequential)] internal struct KEYBDINPUT { internal short wVk; internal short wScan; internal KEYEVENTF dwFlags; internal int time; internal UIntPtr dwExtraInfo; uint unused1; uint unused2; } [Flags] internal enum KEYEVENTF : uint { EXTENDEDKEY = 0x0001, KEYUP = 0x0002, SCANCODE = 0x0008, UNICODE = 0x0004 }
source share