Simulate Keyboard Input in C#

Simulate keyboard input in C#

I like @Gareth's approach at it. However, in his method, you need to hard code your key strokes into the SendInputWithAPI() method. I made a few changes to the code; you now can call Send() and pass ScanCodeShort parameter to it. This allows you to pass any keystroke to it, any time, any place.

 public class Keyboard
{
public void Send(ScanCodeShort a)
{
INPUT[] Inputs = new INPUT[1];
INPUT Input = new INPUT();
Input.type = 1; // 1 = Keyboard Input
Input.U.ki.wScan = a;
Input.U.ki.dwFlags = KEYEVENTF.SCANCODE;
Inputs[0] = Input;
SendInput(1, Inputs, INPUT.Size);
}

/// <summary>
/// Declaration of external SendInput method
/// </summary>
[DllImport("user32.dll")]
internal static extern uint SendInput(
uint nInputs,
[MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs,
int cbSize);

// Declare the INPUT struct
[StructLayout(LayoutKind.Sequential)]
public struct INPUT
{
public uint type;
public InputUnion U;
public static int Size
{
get { return Marshal.SizeOf(typeof(INPUT)); }
}
}

// Declare the InputUnion struct
[StructLayout(LayoutKind.Explicit)]
public struct InputUnion
{
[FieldOffset(0)]
internal MOUSEINPUT mi;
[FieldOffset(0)]
internal KEYBDINPUT ki;
[FieldOffset(0)]
internal HARDWAREINPUT hi;
}

[StructLayout(LayoutKind.Sequential)]
public struct MOUSEINPUT
{
internal int dx;
internal int dy;
internal MouseEventDataXButtons mouseData;
internal MOUSEEVENTF dwFlags;
internal uint time;
internal UIntPtr dwExtraInfo;
}

[Flags]
public enum MouseEventDataXButtons : uint
{
Nothing = 0x00000000,
XBUTTON1 = 0x00000001,
XBUTTON2 = 0x00000002
}

[Flags]
public enum MOUSEEVENTF : uint
{
ABSOLUTE = 0x8000,
HWHEEL = 0x01000,
MOVE = 0x0001,
MOVE_NOCOALESCE = 0x2000,
LEFTDOWN = 0x0002,
LEFTUP = 0x0004,
RIGHTDOWN = 0x0008,
RIGHTUP = 0x0010,
MIDDLEDOWN = 0x0020,
MIDDLEUP = 0x0040,
VIRTUALDESK = 0x4000,
WHEEL = 0x0800,
XDOWN = 0x0080,
XUP = 0x0100
}

[StructLayout(LayoutKind.Sequential)]
public struct KEYBDINPUT
{
internal VirtualKeyShort wVk;
internal ScanCodeShort wScan;
internal KEYEVENTF dwFlags;
internal int time;
internal UIntPtr dwExtraInfo;
}

[Flags]
public enum KEYEVENTF : uint
{
EXTENDEDKEY = 0x0001,
KEYUP = 0x0002,
SCANCODE = 0x0008,
UNICODE = 0x0004
}

public enum VirtualKeyShort : short
{
///<summary>
///Left mouse button
///</summary>
LBUTTON = 0x01,
///<summary>
///Right mouse button
///</summary>
RBUTTON = 0x02,
///<summary>
///Control-break processing
///</summary>
CANCEL = 0x03,
///<summary>
///Middle mouse button (three-button mouse)
///</summary>
MBUTTON = 0x04,
///<summary>
///Windows 2000/XP: X1 mouse button
///</summary>
XBUTTON1 = 0x05,
///<summary>
///Windows 2000/XP: X2 mouse button
///</summary>
XBUTTON2 = 0x06,
///<summary>
///BACKSPACE key
///</summary>
BACK = 0x08,
///<summary>
///TAB key
///</summary>
TAB = 0x09,
///<summary>
///CLEAR key
///</summary>
CLEAR = 0x0C,
///<summary>
///ENTER key
///</summary>
RETURN = 0x0D,
///<summary>
///SHIFT key
///</summary>
SHIFT = 0x10,
///<summary>
///CTRL key
///</summary>
CONTROL = 0x11,
///<summary>
///ALT key
///</summary>
MENU = 0x12,
///<summary>
///PAUSE key
///</summary>
PAUSE = 0x13,
///<summary>
///CAPS LOCK key
///</summary>
CAPITAL = 0x14,
///<summary>
///Input Method Editor (IME) Kana mode
///</summary>
KANA = 0x15,
///<summary>
///IME Hangul mode
///</summary>
HANGUL = 0x15,
///<summary>
///IME Junja mode
///</summary>
JUNJA = 0x17,
///<summary>
///IME final mode
///</summary>
FINAL = 0x18,
///<summary>
///IME Hanja mode
///</summary>
HANJA = 0x19,
///<summary>
///IME Kanji mode
///</summary>
KANJI = 0x19,
///<summary>
///ESC key
///</summary>
ESCAPE = 0x1B,
///<summary>
///IME convert
///</summary>
CONVERT = 0x1C,
///<summary>
///IME nonconvert
///</summary>
NONCONVERT = 0x1D,
///<summary>
///IME accept
///</summary>
ACCEPT = 0x1E,
///<summary>
///IME mode change request
///</summary>
MODECHANGE = 0x1F,
///<summary>
///SPACEBAR
///</summary>
SPACE = 0x20,
///<summary>
///PAGE UP key
///</summary>
PRIOR = 0x21,
///<summary>
///PAGE DOWN key
///</summary>
NEXT = 0x22,
///<summary>
///END key
///</summary>
END = 0x23,
///<summary>
///HOME key
///</summary>
HOME = 0x24,
///<summary>
///LEFT ARROW key
///</summary>
LEFT = 0x25,
///<summary>
///UP ARROW key
///</summary>
UP = 0x26,
///<summary>
///RIGHT ARROW key
///</summary>
RIGHT = 0x27,
///<summary>
///DOWN ARROW key
///</summary>
DOWN = 0x28,
///<summary>
///SELECT key
///</summary>
SELECT = 0x29,
///<summary>
///PRINT key
///</summary>
PRINT = 0x2A,
///<summary>
///EXECUTE key
///</summary>
EXECUTE = 0x2B,
///<summary>
///PRINT SCREEN key
///</summary>
SNAPSHOT = 0x2C,
///<summary>
///INS key
///</summary>
INSERT = 0x2D,
///<summary>
///DEL key
///</summary>
DELETE = 0x2E,
///<summary>
///HELP key
///</summary>
HELP = 0x2F,
///<summary>
///0 key
///</summary>
KEY_0 = 0x30,
///<summary>
///1 key
///</summary>
KEY_1 = 0x31,
///<summary>
///2 key
///</summary>
KEY_2 = 0x32,
///<summary>
///3 key
///</summary>
KEY_3 = 0x33,
///<summary>
///4 key
///</summary>
KEY_4 = 0x34,
///<summary>
///5 key
///</summary>
KEY_5 = 0x35,
///<summary>
///6 key
///</summary>
KEY_6 = 0x36,
///<summary>
///7 key
///</summary>
KEY_7 = 0x37,
///<summary>
///8 key
///</summary>
KEY_8 = 0x38,
///<summary>
///9 key
///</summary>
KEY_9 = 0x39,
///<summary>
///A key
///</summary>
KEY_A = 0x41,
///<summary>
///B key
///</summary>
KEY_B = 0x42,
///<summary>
///C key
///</summary>
KEY_C = 0x43,
///<summary>
///D key
///</summary>
KEY_D = 0x44,
///<summary>
///E key
///</summary>
KEY_E = 0x45,
///<summary>
///F key
///</summary>
KEY_F = 0x46,
///<summary>
///G key
///</summary>
KEY_G = 0x47,
///<summary>
///H key
///</summary>
KEY_H = 0x48,
///<summary>
///I key
///</summary>
KEY_I = 0x49,
///<summary>
///J key
///</summary>
KEY_J = 0x4A,
///<summary>
///K key
///</summary>
KEY_K = 0x4B,
///<summary>
///L key
///</summary>
KEY_L = 0x4C,
///<summary>
///M key
///</summary>
KEY_M = 0x4D,
///<summary>
///N key
///</summary>
KEY_N = 0x4E,
///<summary>
///O key
///</summary>
KEY_O = 0x4F,
///<summary>
///P key
///</summary>
KEY_P = 0x50,
///<summary>
///Q key
///</summary>
KEY_Q = 0x51,
///<summary>
///R key
///</summary>
KEY_R = 0x52,
///<summary>
///S key
///</summary>
KEY_S = 0x53,
///<summary>
///T key
///</summary>
KEY_T = 0x54,
///<summary>
///U key
///</summary>
KEY_U = 0x55,
///<summary>
///V key
///</summary>
KEY_V = 0x56,
///<summary>
///W key
///</summary>
KEY_W = 0x57,
///<summary>
///X key
///</summary>
KEY_X = 0x58,
///<summary>
///Y key
///</summary>
KEY_Y = 0x59,
///<summary>
///Z key
///</summary>
KEY_Z = 0x5A,
///<summary>
///Left Windows key (Microsoft Natural keyboard)
///</summary>
LWIN = 0x5B,
///<summary>
///Right Windows key (Natural keyboard)
///</summary>
RWIN = 0x5C,
///<summary>
///Applications key (Natural keyboard)
///</summary>
APPS = 0x5D,
///<summary>
///Computer Sleep key
///</summary>
SLEEP = 0x5F,
///<summary>
///Numeric keypad 0 key
///</summary>
NUMPAD0 = 0x60,
///<summary>
///Numeric keypad 1 key
///</summary>
NUMPAD1 = 0x61,
///<summary>
///Numeric keypad 2 key
///</summary>
NUMPAD2 = 0x62,
///<summary>
///Numeric keypad 3 key
///</summary>
NUMPAD3 = 0x63,
///<summary>
///Numeric keypad 4 key
///</summary>
NUMPAD4 = 0x64,
///<summary>
///Numeric keypad 5 key
///</summary>
NUMPAD5 = 0x65,
///<summary>
///Numeric keypad 6 key
///</summary>
NUMPAD6 = 0x66,
///<summary>
///Numeric keypad 7 key
///</summary>
NUMPAD7 = 0x67,
///<summary>
///Numeric keypad 8 key
///</summary>
NUMPAD8 = 0x68,
///<summary>
///Numeric keypad 9 key
///</summary>
NUMPAD9 = 0x69,
///<summary>
///Multiply key
///</summary>
MULTIPLY = 0x6A,
///<summary>
///Add key
///</summary>
ADD = 0x6B,
///<summary>
///Separator key
///</summary>
SEPARATOR = 0x6C,
///<summary>
///Subtract key
///</summary>
SUBTRACT = 0x6D,
///<summary>
///Decimal key
///</summary>
DECIMAL = 0x6E,
///<summary>
///Divide key
///</summary>
DIVIDE = 0x6F,
///<summary>
///F1 key
///</summary>
F1 = 0x70,
///<summary>
///F2 key
///</summary>
F2 = 0x71,
///<summary>
///F3 key
///</summary>
F3 = 0x72,
///<summary>
///F4 key
///</summary>
F4 = 0x73,
///<summary>
///F5 key
///</summary>
F5 = 0x74,
///<summary>
///F6 key
///</summary>
F6 = 0x75,
///<summary>
///F7 key
///</summary>
F7 = 0x76,
///<summary>
///F8 key
///</summary>
F8 = 0x77,
///<summary>
///F9 key
///</summary>
F9 = 0x78,
///<summary>
///F10 key
///</summary>
F10 = 0x79,
///<summary>
///F11 key
///</summary>
F11 = 0x7A,
///<summary>
///F12 key
///</summary>
F12 = 0x7B,
///<summary>
///F13 key
///</summary>
F13 = 0x7C,
///<summary>
///F14 key
///</summary>
F14 = 0x7D,
///<summary>
///F15 key
///</summary>
F15 = 0x7E,
///<summary>
///F16 key
///</summary>
F16 = 0x7F,
///<summary>
///F17 key
///</summary>
F17 = 0x80,
///<summary>
///F18 key
///</summary>
F18 = 0x81,
///<summary>
///F19 key
///</summary>
F19 = 0x82,
///<summary>
///F20 key
///</summary>
F20 = 0x83,
///<summary>
///F21 key
///</summary>
F21 = 0x84,
///<summary>
///F22 key, (PPC only) Key used to lock device.
///</summary>
F22 = 0x85,
///<summary>
///F23 key
///</summary>
F23 = 0x86,
///<summary>
///F24 key
///</summary>
F24 = 0x87,
///<summary>
///NUM LOCK key
///</summary>
NUMLOCK = 0x90,
///<summary>
///SCROLL LOCK key
///</summary>
SCROLL = 0x91,
///<summary>
///Left SHIFT key
///</summary>
LSHIFT = 0xA0,
///<summary>
///Right SHIFT key
///</summary>
RSHIFT = 0xA1,
///<summary>
///Left CONTROL key
///</summary>
LCONTROL = 0xA2,
///<summary>
///Right CONTROL key
///</summary>
RCONTROL = 0xA3,
///<summary>
///Left MENU key
///</summary>
LMENU = 0xA4,
///<summary>
///Right MENU key
///</summary>
RMENU = 0xA5,
///<summary>
///Windows 2000/XP: Browser Back key
///</summary>
BROWSER_BACK = 0xA6,
///<summary>
///Windows 2000/XP: Browser Forward key
///</summary>
BROWSER_FORWARD = 0xA7,
///<summary>
///Windows 2000/XP: Browser Refresh key
///</summary>
BROWSER_REFRESH = 0xA8,
///<summary>
///Windows 2000/XP: Browser Stop key
///</summary>
BROWSER_STOP = 0xA9,
///<summary>
///Windows 2000/XP: Browser Search key
///</summary>
BROWSER_SEARCH = 0xAA,
///<summary>
///Windows 2000/XP: Browser Favorites key
///</summary>
BROWSER_FAVORITES = 0xAB,
///<summary>
///Windows 2000/XP: Browser Start and Home key
///</summary>
BROWSER_HOME = 0xAC,
///<summary>
///Windows 2000/XP: Volume Mute key
///</summary>
VOLUME_MUTE = 0xAD,
///<summary>
///Windows 2000/XP: Volume Down key
///</summary>
VOLUME_DOWN = 0xAE,
///<summary>
///Windows 2000/XP: Volume Up key
///</summary>
VOLUME_UP = 0xAF,
///<summary>
///Windows 2000/XP: Next Track key
///</summary>
MEDIA_NEXT_TRACK = 0xB0,
///<summary>
///Windows 2000/XP: Previous Track key
///</summary>
MEDIA_PREV_TRACK = 0xB1,
///<summary>
///Windows 2000/XP: Stop Media key
///</summary>
MEDIA_STOP = 0xB2,
///<summary>
///Windows 2000/XP: Play/Pause Media key
///</summary>
MEDIA_PLAY_PAUSE = 0xB3,
///<summary>
///Windows 2000/XP: Start Mail key
///</summary>
LAUNCH_MAIL = 0xB4,
///<summary>
///Windows 2000/XP: Select Media key
///</summary>
LAUNCH_MEDIA_SELECT = 0xB5,
///<summary>
///Windows 2000/XP: Start Application 1 key
///</summary>
LAUNCH_APP1 = 0xB6,
///<summary>
///Windows 2000/XP: Start Application 2 key
///</summary>
LAUNCH_APP2 = 0xB7,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_1 = 0xBA,
///<summary>
///Windows 2000/XP: For any country/region, the '+' key
///</summary>
OEM_PLUS = 0xBB,
///<summary>
///Windows 2000/XP: For any country/region, the ',' key
///</summary>
OEM_COMMA = 0xBC,
///<summary>
///Windows 2000/XP: For any country/region, the '-' key
///</summary>
OEM_MINUS = 0xBD,
///<summary>
///Windows 2000/XP: For any country/region, the '.' key
///</summary>
OEM_PERIOD = 0xBE,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_2 = 0xBF,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_3 = 0xC0,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_4 = 0xDB,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_5 = 0xDC,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_6 = 0xDD,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_7 = 0xDE,
///<summary>
///Used for miscellaneous characters; it can vary by keyboard.
///</summary>
OEM_8 = 0xDF,
///<summary>
///Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard
///</summary>
OEM_102 = 0xE2,
///<summary>
///Windows 95/98/Me, Windows NT 4.0, Windows 2000/XP: IME PROCESS key
///</summary>
PROCESSKEY = 0xE5,
///<summary>
///Windows 2000/XP: Used to pass Unicode characters as if they were keystrokes.
///The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information,
///see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP
///</summary>
PACKET = 0xE7,
///<summary>
///Attn key
///</summary>
ATTN = 0xF6,
///<summary>
///CrSel key
///</summary>
CRSEL = 0xF7,
///<summary>
///ExSel key
///</summary>
EXSEL = 0xF8,
///<summary>
///Erase EOF key
///</summary>
EREOF = 0xF9,
///<summary>
///Play key
///</summary>
PLAY = 0xFA,
///<summary>
///Zoom key
///</summary>
ZOOM = 0xFB,
///<summary>
///Reserved
///</summary>
NONAME = 0xFC,
///<summary>
///PA1 key
///</summary>
PA1 = 0xFD,
///<summary>
///Clear key
///</summary>
OEM_CLEAR = 0xFE
}

public enum ScanCodeShort : short
{
LBUTTON = 0,
RBUTTON = 0,
CANCEL = 70,
MBUTTON = 0,
XBUTTON1 = 0,
XBUTTON2 = 0,
BACK = 14,
TAB = 15,
CLEAR = 76,
RETURN = 28,
SHIFT = 42,
CONTROL = 29,
MENU = 56,
PAUSE = 0,
CAPITAL = 58,
KANA = 0,
HANGUL = 0,
JUNJA = 0,
FINAL = 0,
HANJA = 0,
KANJI = 0,
ESCAPE = 1,
CONVERT = 0,
NONCONVERT = 0,
ACCEPT = 0,
MODECHANGE = 0,
SPACE = 57,
PRIOR = 73,
NEXT = 81,
END = 79,
HOME = 71,
LEFT = 75,
UP = 72,
RIGHT = 77,
DOWN = 80,
SELECT = 0,
PRINT = 0,
EXECUTE = 0,
SNAPSHOT = 84,
INSERT = 82,
DELETE = 83,
HELP = 99,
KEY_0 = 11,
KEY_1 = 2,
KEY_2 = 3,
KEY_3 = 4,
KEY_4 = 5,
KEY_5 = 6,
KEY_6 = 7,
KEY_7 = 8,
KEY_8 = 9,
KEY_9 = 10,
KEY_A = 30,
KEY_B = 48,
KEY_C = 46,
KEY_D = 32,
KEY_E = 18,
KEY_F = 33,
KEY_G = 34,
KEY_H = 35,
KEY_I = 23,
KEY_J = 36,
KEY_K = 37,
KEY_L = 38,
KEY_M = 50,
KEY_N = 49,
KEY_O = 24,
KEY_P = 25,
KEY_Q = 16,
KEY_R = 19,
KEY_S = 31,
KEY_T = 20,
KEY_U = 22,
KEY_V = 47,
KEY_W = 17,
KEY_X = 45,
KEY_Y = 21,
KEY_Z = 44,
LWIN = 91,
RWIN = 92,
APPS = 93,
SLEEP = 95,
NUMPAD0 = 82,
NUMPAD1 = 79,
NUMPAD2 = 80,
NUMPAD3 = 81,
NUMPAD4 = 75,
NUMPAD5 = 76,
NUMPAD6 = 77,
NUMPAD7 = 71,
NUMPAD8 = 72,
NUMPAD9 = 73,
MULTIPLY = 55,
ADD = 78,
SEPARATOR = 0,
SUBTRACT = 74,
DECIMAL = 83,
DIVIDE = 53,
F1 = 59,
F2 = 60,
F3 = 61,
F4 = 62,
F5 = 63,
F6 = 64,
F7 = 65,
F8 = 66,
F9 = 67,
F10 = 68,
F11 = 87,
F12 = 88,
F13 = 100,
F14 = 101,
F15 = 102,
F16 = 103,
F17 = 104,
F18 = 105,
F19 = 106,
F20 = 107,
F21 = 108,
F22 = 109,
F23 = 110,
F24 = 118,
NUMLOCK = 69,
SCROLL = 70,
LSHIFT = 42,
RSHIFT = 54,
LCONTROL = 29,
RCONTROL = 29,
LMENU = 56,
RMENU = 56,
BROWSER_BACK = 106,
BROWSER_FORWARD = 105,
BROWSER_REFRESH = 103,
BROWSER_STOP = 104,
BROWSER_SEARCH = 101,
BROWSER_FAVORITES = 102,
BROWSER_HOME = 50,
VOLUME_MUTE = 32,
VOLUME_DOWN = 46,
VOLUME_UP = 48,
MEDIA_NEXT_TRACK = 25,
MEDIA_PREV_TRACK = 16,
MEDIA_STOP = 36,
MEDIA_PLAY_PAUSE = 34,
LAUNCH_MAIL = 108,
LAUNCH_MEDIA_SELECT = 109,
LAUNCH_APP1 = 107,
LAUNCH_APP2 = 33,
OEM_1 = 39,
OEM_PLUS = 13,
OEM_COMMA = 51,
OEM_MINUS = 12,
OEM_PERIOD = 52,
OEM_2 = 53,
OEM_3 = 41,
OEM_4 = 26,
OEM_5 = 43,
OEM_6 = 27,
OEM_7 = 40,
OEM_8 = 0,
OEM_102 = 86,
PROCESSKEY = 0,
PACKET = 0,
ATTN = 0,
CRSEL = 0,
EXSEL = 0,
EREOF = 93,
PLAY = 0,
ZOOM = 98,
NONAME = 0,
PA1 = 0,
OEM_CLEAR = 0,
}

/// <summary>
/// Define HARDWAREINPUT struct
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct HARDWAREINPUT
{
internal int uMsg;
internal short wParamL;
internal short wParamH;
}
}

Simulating Key Press C#

Here's an example...

static class Program
{
[DllImport("user32.dll")]
public static extern int SetForegroundWindow(IntPtr hWnd);

[STAThread]
static void Main()
{
while(true)
{
Process [] processes = Process.GetProcessesByName("iexplore");

foreach(Process proc in processes)
{
SetForegroundWindow(proc.MainWindowHandle);
SendKeys.SendWait("{F5}");
}

Thread.Sleep(5000);
}
}
}

a better one... less anoying...

static class Program
{
const UInt32 WM_KEYDOWN = 0x0100;
const int VK_F5 = 0x74;

[DllImport("user32.dll")]
static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);

[STAThread]
static void Main()
{
while(true)
{
Process [] processes = Process.GetProcessesByName("iexplore");

foreach(Process proc in processes)
PostMessage(proc.MainWindowHandle, WM_KEYDOWN, VK_F5, 0);

Thread.Sleep(5000);
}
}
}

How to use SendInput to simulate the UP arrow key press (or other extended keys)

A few notes about SendInput(), in relation to what you tried to do.

  • This function accepts and array of INPUT structures. You need to pass all Key presses in a single call to this function. This include a Key and Key modifiers (Control, Shift, ALT, Menu et.)
  • The input is sent to the current Input recipient, so you need to make sure the Window that is meant to receive the key presses is Focused (or its Parent Window or the Main Window, i.e., the window that actually processes the key presses)
  • If the target Window belongs to a different Thread, the call to SetFocus() may fail, so we attach to that Thread beforehand.
  • If the parent Main Window is minimized, you need to bring it up beforehand, to be sure it will receive focus and then our input.

Here, I'm using GetCurrentThreadId() and compare with GetWindowThreadProcessId(), to verify whether the caller Thread and the target Thread are different.

If they're not the same, then AttachThreadInput() is called.

If the target Main Window is minimized (see the call to IsIconic()), it's restored, calling SetWindowPlacement() and brought to the foreground using BringWindowToTop().

Then a call to SetFocus() moves the focus to the target handle (assuming it can receive focus, that is - the function should return success anyway).

In the end, you collect all the Keys you need to send in different INPUT structs (each Key Modifiers in its own struct) and make a single call to SendInput().


For example:

Send the Up key to the target handle:

IntPtr handle = [The selected handle];
bool result = NativeMethods.SendKeyboardInput(handle, Keys.Up, null);

Send Control + Shift + Home:

var modifiers = new[] { Keys.ShiftKey, Keys.ControlKey};
bool result = NativeMethods.SendKeyboardInput(handle, Keys.Home, modifiers);

This is how it works:

SendInput test

A standard PictureBox cannot be focused, so you'll see a Button flicker when SetFocus() is called

Sample Project for testing (Google Drive)



Related Topics



Leave a reply



Submit