Skip to content

iXab3r/Keyboard

 
 

Repository files navigation

Keyboard

Background/Foreground Key handler

Allows a developer the ability using the C# stack the ability of sending background keypresses and mouse events to any process.

This is useful for any type of automation, or testing. Although it's original roots come from being the key input handler for a botting program for the Aion online MMORPG. Since then it has been tested with many more applications and proven to be a solid library for background input events.

Demo added that shows this process working on the standard Notepad application, which only accepts Foreground input. Use notepad++ or another application to test background key presses.

PostMessage and SendMessage

How to send background keypresses.

Hello, This I feel is something that is completely misunderstood by most people so i thought i’d drop a knowledge bomb. PostMessage and SendMessage are two c/c++ functions that allow for a programmer to access Win32 API messaging. The parameters required for these messages are hWnd, wMsg, wParam, lParam.

Details:

hWnd: This is the handle to the window that you wish to send a message to in this case that will be the aion.bin mainwindowhandle. wMsg: This is the message that you plan on sending, generally to impersonate key presses you’ll need to send multiple messages, below is a simple list.

KEY_DOWN = (0x0100),
KEY_UP = (0x0101),
VM_CHAR = (0x0102),
SYSKEYDOWN = (0x0104),
SYSKEYUP = (0x0105),
SYSCHAR = (0x0106),
LBUTTONDOWN = (0x201), //Left mousebutton down
LBUTTONUP = (0x202),  //Left mousebutton up
LBUTTONDBLCLK = (0x203), //Left mousebutton doubleclick
RBUTTONDOWN = (0x204), //Right mousebutton down
RBUTTONUP = (0x205),   //Right mousebutton up
RBUTTONDBLCLK = (0x206) //Right mousebutton doubleclick

wParam: Quite simply this for key pressing is the Virtual Key Code of the key you want to press. A list can be found http://msdn.microsoft.com/en-us/library/ms645540(VS.85).aspx.

KEY_0 = 0x30,   //0 key  KEY_1 = 0x31,   //1 key  KEY_2 = 0x32,   //2 key  KEY_3 = 0x33,   //3 key  KEY_4 = 0x34,   //4 key  KEY_5 = 0x35,   //5 key  KEY_6 = 0x36,    //6 key  KEY_7 = 0x37,    //7 key  KEY_8 = 0x38,   //8 key  KEY_9 = 0x39,    //9 key KEY_MINUS = 0xBD, // - key KEY_PLUS = 0xBB, // + key KEY_A = 0x41,   //A key  KEY_B = 0x42,   //B key  KEY_C = 0x43,   //C key  KEY_D = 0x44,   //D key  KEY_E = 0x45,   //E key  KEY_F = 0x46,   //F key  KEY_G = 0x47,   //G key  KEY_H = 0x48,   //H key  KEY_I = 0x49,    //I key  KEY_J = 0x4A,   //J key  KEY_K = 0x4B,   //K key  KEY_L = 0x4C,   //L key  KEY_M = 0x4D,   //M key  KEY_N = 0x4E,    //N key  KEY_O = 0x4F,   //O key  KEY_P = 0x50,    //P key  KEY_Q = 0x51,   //Q key  KEY_R = 0x52,   //R key  KEY_S = 0x53,   //S key  KEY_T = 0x54,   //T key  KEY_U = 0x55,   //U key  KEY_V = 0x56,   //V key  KEY_W = 0x57,   //W key  KEY_X = 0x58,   //X key  KEY_Y = 0x59,   //Y key  KEY_Z = 0x5A,    //Z key  KEY_LBUTTON = 0x01,   //Left mouse button  KEY_RBUTTON = 0x02,   //Right mouse button  KEY_CANCEL = 0x03,   //Control-break processing  KEY_MBUTTON = 0x04,   //Middle mouse button (three-button mouse)  KEY_BACK = 0x08,   //BACKSPACE key  KEY_TAB = 0x09,   //TAB key  KEY_CLEAR = 0x0C,   //CLEAR key  KEY_RETURN = 0x0D,   //ENTER key  KEY_SHIFT = 0x10,   //SHIFT key  KEY_CONTROL = 0x11,   //CTRL key  KEY_MENU = 0x12,   //ALT key  KEY_PAUSE = 0x13,   //PAUSE key  KEY_CAPITAL = 0x14,   //CAPS LOCK key  KEY_ESCAPE = 0x1B,   //ESC key  KEY_SPACE = 0x20,   //SPACEBAR  KEY_PRIOR = 0x21,   //PAGE UP key  KEY_NEXT = 0x22,   //PAGE DOWN key  KEY_END = 0x23,   //END key  KEY_HOME = 0x24,   //HOME key  KEY_LEFT = 0x25,   //LEFT ARROW key  KEY_UP = 0x26,   //UP ARROW key  KEY_RIGHT = 0x27,   //RIGHT ARROW key  KEY_DOWN = 0x28,   //DOWN ARROW key  KEY_SELECT = 0x29,   //SELECT key  KEY_PRINT = 0x2A,   //PRINT key  KEY_EXECUTE = 0x2B,   //EXECUTE key  KEY_SNAPSHOT = 0x2C,   //PRINT SCREEN key  KEY_INSERT = 0x2D,   //INS key  KEY_DELETE = 0x2E,   //DEL key  KEY_HELP = 0x2F,   //HELP key  KEY_NUMPAD0 = 0x60,   //Numeric keypad 0 key  KEY_NUMPAD1 = 0x61,   //Numeric keypad 1 key  KEY_NUMPAD2 = 0x62,   //Numeric keypad 2 key  KEY_NUMPAD3 = 0x63,   //Numeric keypad 3 key  KEY_NUMPAD4 = 0x64,   //Numeric keypad 4 key  KEY_NUMPAD5 = 0x65,   //Numeric keypad 5 key  KEY_NUMPAD6 = 0x66,   //Numeric keypad 6 key  KEY_NUMPAD7 = 0x67,   //Numeric keypad 7 key  KEY_NUMPAD8 = 0x68,   //Numeric keypad 8 key  KEY_NUMPAD9 = 0x69,   //Numeric keypad 9 key  KEY_SEPARATOR = 0x6C,   //Separator key  KEY_SUBTRACT = 0x6D,   //Subtract key  KEY_DECIMAL = 0x6E,   //Decimal key  KEY_DIVIDE = 0x6F,   //Divide key  KEY_F1 = 0x70,   //F1 key  KEY_F2 = 0x71,   //F2 key  KEY_F3 = 0x72,   //F3 key  KEY_F4 = 0x73,   //F4 key  KEY_F5 = 0x74,   //F5 key  KEY_F6 = 0x75,   //F6 key  KEY_F7 = 0x76,   //F7 key  KEY_F8 = 0x77,   //F8 key  KEY_F9 = 0x78,   //F9 key  KEY_F10 = 0x79,   //F10 key  KEY_F11 = 0x7A,   //F11 key  KEY_F12 = 0x7B,   //F12 key  KEY_SCROLL = 0x91,   //SCROLL LOCK key  KEY_LSHIFT = 0xA0,   //Left SHIFT key  KEY_RSHIFT = 0xA1,   //Right SHIFT key  KEY_LCONTROL = 0xA2,   //Left CONTROL key  KEY_RCONTROL = 0xA3,    //Right CONTROL key  KEY_LMENU = 0xA4,      //Left MENU key  KEY_RMENU = 0xA5,   //Right MENU key  KEY_COMMA = 0xBC,	//, key KEY_PERIOD = 0xBE,	//. key KEY_PLAY = 0xFA,   //Play key  KEY_ZOOM = 0xFB, //Zoom key  NULL = 0x0,

lParam: This is a structure and is quite complex. Since we are simply dealing with keypresses messaging this simplifies the lParam quite a bit.

Here is the bit mapping for the 32-bit lParam: 0-15

Specifies the repeat count. The value is the number of times the keystroke is repeated as a result of the user holding down the key. The repeat count is always one for a WM_KEYUP message.

16-23 Specifies the scan code. The value depends on the original equipment manufacturer (OEM). 24 Specifies whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0. 25-28 Reserved; do not use. 29 Specifies the context code. The value is always 0 for a WM_KEYUP message. 30 Specifies the previous key state. The value is always 1 for a WM_KEYUP message. 31 Specifies the transition state. The value is always 1 for a WM_KEYUP message. Return Value

const uint MAPVK_VK_TO_VSC = 0x00;
const uint MAPVK_VSC_TO_VK = 0x01;
const uint MAPVK_VK_TO_CHAR = 0x02;
const uint MAPVK_VSC_TO_VK_EX = 0x03;
const uint MAPVK_VK_TO_VSC_EX = 0x04;
uint lParam = (uint)repeatCount;
uint scanCode = MapVirtualKey((uint)[One of the VM_KEYS], MAPVK_VK_TO_VSC_EX);
lParam += (uint)(scanCode * 0x10000);
lParam += (uint)((extended) * 0x1000000);
lParam += (uint)((contextCode * 2) * 0x10000000);
lParam += (uint)((previousState * 4) * 0x10000000);
lParam += (uint)((transitionState * 8) * 0x10000000);
return lParam;

Since you will need the Scan Code for the virtual key i recommend using http://msdn.microsoft.com/en-us/library/ms646306(VS.85).aspx function since it will make it easy. I hope this helps everyone.

Use Spy++ it comes with visual studio and enjoy.

About

Background/Foreground Keyboard and Mouse input handler

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C# 100.0%