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.

One thought on “PostMessage and SendMessage

  1. 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?

Leave a comment