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.
Great article! Irony is that I play Aion atm and was looking for something like this. Just a question, which DLL I have to import to my c# project?