using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Input;
namespace libWin32.Win32.Input
{
public class InputSender
{
public const int KEYUP_WAIT_TIME = 0;
#region INPUTTYPE CONSTANTS
public const uint INPUT_MOUSE = 0x0;
public const int INPUT_KEYBOARD = 0x1;
public const int INPUT_HARDWARE = 0x2;
#endregion
#region KEYEVENTF CONSTANTS
public const uint KEYEVENTF_EXTENDEDKEY = 0x1;
public const uint KEYEVENTF_KEYDOWN = 0x0;
public const uint KEYEVENTF_KEYUP = 0x2;
public const uint KEYEVENTF_UNICODE = 0x4;
public const uint KEYEVENTF_SCANCODE = 0x8;
#endregion
#region XBUTTON CONSTANTS
public const uint XBUTTON1 = 0x1;
public const uint XBUTTON2 = 0x2;
#endregion
#region MOUSEEVENTF CONSTANTS
public const uint MOUSEEVENTF_MOVE = 0x1;
public const uint MOUSEEVENTF_LEFTDOWN = 0x2;
public const uint MOUSEEVENTF_LEFTUP = 0x4;
public const uint MOUSEEVENTF_RIGHTDOWN = 0x8;
public const uint MOUSEEVENTF_RIGHTUP = 0x10;
public const uint MOUSEEVENTF_MIDDLEDOWN = 0x20;
public const uint MOUSEEVENTF_MIDDLEUP = 0x40;
public const uint MOUSEEVENTF_XDOWN = 0x80;
public const uint MOUSEEVENTF_XUP = 0x100;
public const uint MOUSEEVENTF_WHEEL = 0x800;
public const uint MOUSEEVENTF_VIRTUALDESK = 0x4000;
public const uint MOUSEEVENTF_ABSOLUTE = 0x8000;
#endregion
[StructLayout(LayoutKind.Explicit)]
struct INPUT
{
[FieldOffset(0)]
public int dwType;
[FieldOffset(4)]
public MOUSEINPUT mouseInput;
[FieldOffset(4)]
public KEYBDINPUT keyboardInput;
[FieldOffset(4)]
public HARDWAREINPUT hardwareInput;
}
[StructLayout(LayoutKind.Explicit)]
struct KEYBDINPUT
{
[FieldOffset(0)]
public short wVk;
[FieldOffset(2)]
public short wScan;
[FieldOffset(4)]
public uint dwFlags;
[FieldOffset(8)]
public int time;
[FieldOffset(12)]
public IntPtr dwExtraInfo;
}
[StructLayout(LayoutKind.Explicit)]
struct HARDWAREINPUT
{
[FieldOffset(0)]
public int uMsg;
[FieldOffset(4)]
public short wParamL;
[FieldOffset(6)]
public short wParamH;
}
///
/// The mouse data structure
///
[StructLayout(LayoutKind.Explicit)]
struct MOUSEINPUT
{
[FieldOffset(0)]
public int dx;
[FieldOffset(4)]
public int dy;
[FieldOffset(8)]
public int mouseData;
[FieldOffset(12)]
public int dwFlags;
[FieldOffset(16)]
public int time;
[FieldOffset(20)]
public IntPtr dwExtraInfo;
}
[DllImport("user32.dll")]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
[DllImport("user32.dll", SetLastError = true)]
static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);
[DllImport("user32.dll")]
static extern bool BlockInput(bool fBlockIt);
public void BlockUserInput() { BlockInput(true); }
public void UnBlockUserInput() { BlockInput(false); }
public static bool isExtendedVKKey(Key VKKey)
{
if (VKKey == Key.Insert || VKKey == Key.Left || VKKey == Key.Home || VKKey == Key.End ||
VKKey == Key.Up || VKKey == Key.Down || VKKey == Key.PageUp || VKKey == Key.PageDown || VKKey == Key.Right)
{
return true;
}
return false;
}
public static bool isExtendedScanCode(short ScanCode)
{
DXKeysToScanCodes t = (DXKeysToScanCodes)ScanCode;
if (ScanCode == 0)
t = DXKeysToScanCodes.DIK_UNKOWN;
if (t == DXKeysToScanCodes.DIK_UP ||
t == DXKeysToScanCodes.DIK_DOWN ||
t == DXKeysToScanCodes.DIK_LEFT ||
t == DXKeysToScanCodes.DIK_RIGHT ||
t == DXKeysToScanCodes.DIK_HOME ||
t == DXKeysToScanCodes.DIK_END ||
t == DXKeysToScanCodes.DIK_NUMPADENTER ||
t == DXKeysToScanCodes.DIK_RCONTROL ||
t == DXKeysToScanCodes.DIK_RMENU ||
t == DXKeysToScanCodes.DIK_LEFT ||
t == DXKeysToScanCodes.DIK_PRIOR ||
t == DXKeysToScanCodes.DIK_NEXT ||
t == DXKeysToScanCodes.DIK_INSERT ||
t == DXKeysToScanCodes.DIK_DELETE)
{
return true;
}
return false;
}
static void DXKeyDown(short DXScanCode)
{
INPUT inputs = new INPUT();
inputs.dwType = INPUT_KEYBOARD;
if (isExtendedScanCode(DXScanCode))
{
inputs.keyboardInput.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYDOWN | KEYEVENTF_EXTENDEDKEY;
}
else
{
inputs.keyboardInput.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYDOWN;
}
inputs.keyboardInput.wScan = DXScanCode;
int cbSize = Marshal.SizeOf(typeof(INPUT));
SendInput(1, ref inputs, cbSize);
}
static void DXKeyUp(short DXScanCode, TimeSpan wait)
{
if (wait.TotalMilliseconds > 0)
Thread.Sleep(wait);
INPUT inputs = new INPUT();
inputs.dwType = INPUT_KEYBOARD;
if (isExtendedScanCode(DXScanCode))
{
inputs.keyboardInput.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP | KEYEVENTF_EXTENDEDKEY;
}
else
{
inputs.keyboardInput.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
}
inputs.keyboardInput.wScan = DXScanCode;
int cbSize = Marshal.SizeOf(typeof(INPUT));
SendInput(1, ref inputs, cbSize);
}
public static void SendDXKey(short DXKey)
{
PressDXKey(DXKey);
}
public static void SendDXKey(List DXKeys)
{
foreach (short DXKey in DXKeys)
{
PressDXKey(DXKey);
}
}
public static void PressDXKey(short DXKey)
{
DXKeyDown((short)DXKey);
DXKeyUp((short)DXKey, TimeSpan.FromMilliseconds(250));
}
public static void PressDXKey(List DXKeys)
{
foreach (short DXKey in DXKeys)
{
DXKeyDown((short)DXKey);
DXKeyUp((short)DXKey, TimeSpan.FromMilliseconds(250));
}
}
public static void PressDXKey_NoRelease(short DXKey)
{
DXKeyDown((short)DXKey);
//DXKeyUp((short)DXKey, TimeSpan.FromMilliseconds(KEYUP_WAIT_TIME));
}
public static void PressDXKey_NoRelease(List DXKeys)
{
foreach (short DXKey in DXKeys)
{
DXKeyDown((short)DXKey);
//DXKeyUp((short)DXKey, TimeSpan.FromMilliseconds(KEYUP_WAIT_TIME));
}
}
public static void ReleaseDXKey(short DXKey)
{
//DXKeyDown((short)DXKey);
DXKeyUp((short)DXKey, TimeSpan.FromMilliseconds(KEYUP_WAIT_TIME));
}
public static void ReleaseDXKey(List DXKeys)
{
foreach (short DXKey in DXKeys)
{
//DXKeyDown((short)DXKey);
DXKeyUp((short)DXKey, TimeSpan.FromMilliseconds(KEYUP_WAIT_TIME));
}
}
}
}