Okay.
Here it is. (C# 200
Code:
void press(int scanCode)
{
sendKey(scanCode, true);
}
void release(int scanCode)
{
sendKey(scanCode, false);
}
private void sendKey(int scanCode, bool press)
{
KEYBOARD_INPUT[] input = new KEYBOARD_INPUT[1];
input[0] = new KEYBOARD_INPUT();
input[0].type = INPUT_KEYBOARD;
input[0].flags = KEY_SCANCODE;
if ((scanCode & 0xFF00) == 0xE000)
{ // extended key?
input[0].flags |= KEY_EXTENDED;
}
if (press)
{ // press?
input[0].scanCode = (ushort)(scanCode & 0xFF);
}
else
{ // release?
input[0].scanCode = (ushort)scanCode;
input[0].flags |= KEY_UP;
}
uint result = SendInput(1, input, Marshal.SizeOf(input[0]));
if (result != 1)
{
throw new Exception("Could not send key: " + scanCode);
}
}
const uint INPUT_KEYBOARD = 1;
const int KEY_EXTENDED = 0x0001;
const uint KEY_UP = 0x0002;
const uint KEY_SCANCODE = 0x0008;
[StructLayout(LayoutKind.Sequential)]
private struct KEYBOARD_INPUT
{
public uint type;
public ushort vk;
public ushort scanCode;
public uint flags;
public uint time;
public uint extrainfo;
public uint padding1;
public uint padding2;
}
[DllImport("User32.dll")]
private static extern uint SendInput(uint numberOfInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] KEYBOARD_INPUT[] input, int structSize);