Mega Code Archive

 
Categories / Delphi / Examples
 

Sending a keystroke to another application

How to send keypresses to other apps. There are several mthods of sending a keystroke to another application. One way is by sending the keystroke directly to the keyboard buffrer through the WIN32 function keybd_event(). This function does not except a window handle (HWND), it merely mimics the keyboard by sending virtual keys to the top most window. If you do not make the application top most, possibly by calling SetForegroundWindow(), then the key strokes will most likely be sent to your own application. The example I am using will open the Windows Notepad and send initial text. To open Notepad we will be using the WIN32 function WinExec(). Notice in the example that some characters being sent in will have an uppercase shift state; the shift key needs to be depressed before sending the particular characters then it needs to be released. Also, each character being sent in needs to be depressed on the keyboard then released. Telling the keyboard driver whether to depress or release the key is done through the third parameter of the function as described below. To make sure you capture the virtual key code for standard characters we will be using the WIN32 function VkKeyScan(). We will be adding a button and the code to our TButton.OnClick. WinExec() runs the specified application. lpCmdLine - parameter #1 This is the command line for Notepad, "c:/windows/notepad.exe" If you do not supply the directory path then Windows will search for the executable, Notepad.exe, in this order 1. The current directory. 2. The Windows system directory. 3. The Windows directory. 4. The directories listed in the PATH environment variable. uCmdShow - parameter #2 This is the window style for the executed application, Notepad.exe We will be using SW_SHOWNORMAL which activates and displays a window. If the window is minimized or maximized, Windows restores it to its original size and position. An application should specify this flag when displaying the window for the first time. VkKeyScan() translates a character to the corresponding virtual-key code and shift state for the current keyboard. ch - parameter #1 This is the character you want the virtual-key code for Simply send in a single character as as string and the virtual-key code will result keybd_event() generates a keystroke. bVk - parameter #1 This is your virtual-key code. For standard virtual-key codes you can type in the constant value as defined in the Windows.pas file. Example 2 below lists the general virtual-key codes For general characters you will need to call VkKeyScan() to accurately retrieve the virtual-key code. bScan - parameter #2 hardware scan code for the key dwFlags - parameter #3 A set of flag bits that specify various aspects of function operation. A null value, 0, will indicate the key is to be depressed KEYEVENTF_KEYUP will indicate the key is to be released dwExtraInfo - parameter #4 We do not use this. I am not sure how this parameter comes into play, maybe you can send me details if you know. Example 1: {...} type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; {...} procedure TForm1.Button1Click(Sender: TObject); begin WinExec('notepad.exe', SW_SHOWNORMAL); { send '***' and ENTER } keybd_event(VK_SHIFT, 1, 0, 0); keybd_event(VkKeyScan('*'), 1, 0, 0); keybd_event(VkKeyScan('*'), 1, KEYEVENTF_KEYUP, 0); keybd_event(VkKeyScan('*'), 1, 0, 0); keybd_event(VkKeyScan('*'), 1, KEYEVENTF_KEYUP, 0); keybd_event(VkKeyScan('*'), 1, 0, 0); keybd_event(VkKeyScan('*'), 1, KEYEVENTF_KEYUP, 0); keybd_event(VK_SHIFT, 1, KEYEVENTF_KEYUP, 0); keybd_event(VK_RETURN, 1, 0, 0); keybd_event(VK_RETURN, 1, KEYEVENTF_KEYUP, 0); { send 'Lou's Delphi Tips' and ENTER } keybd_event(VK_SHIFT, 1, 0, 0); keybd_event(VkKeyScan('L'), 1, 0, 0); keybd_event(VkKeyScan('L'), 1, KEYEVENTF_KEYUP, 0); keybd_event(VK_SHIFT, 1, KEYEVENTF_KEYUP, 0); keybd_event(VkKeyScan('O'), 1, 0, 0); keybd_event(VkKeyScan('O'), 1, KEYEVENTF_KEYUP, 0); keybd_event(VkKeyScan('U'), 1, 0, 0); keybd_event(VkKeyScan('U'), 1, KEYEVENTF_KEYUP, 0); keybd_event(VkKeyScan(''''), 1, 0, 0); keybd_event(VkKeyScan(''''), 1, KEYEVENTF_KEYUP, 0); keybd_event(VkKeyScan('S'), 1, 0, 0); keybd_event(VkKeyScan('S'), 1, KEYEVENTF_KEYUP, 0); keybd_event(VkKeyScan(' '), 1, 0, 0); keybd_event(VkKeyScan(' '), 1, KEYEVENTF_KEYUP, 0); keybd_event(VK_SHIFT, 1, 0, 0); keybd_event(VkKeyScan('D'), 1, 0, 0); keybd_event(VkKeyScan('D'), 1, KEYEVENTF_KEYUP, 0); keybd_event(VK_SHIFT, 1, KEYEVENTF_KEYUP, 0); keybd_event(VkKeyScan('E'), 1, 0, 0); keybd_event(VkKeyScan('E'), 1, KEYEVENTF_KEYUP, 0); keybd_event(VkKeyScan('L'), 1, 0, 0); keybd_event(VkKeyScan('L'), 1, KEYEVENTF_KEYUP, 0); keybd_event(VkKeyScan('P'), 1, 0, 0); keybd_event(VkKeyScan('P'), 1, KEYEVENTF_KEYUP, 0); keybd_event(VkKeyScan('H'), 1, 0, 0); keybd_event(VkKeyScan('H'), 1, KEYEVENTF_KEYUP, 0); keybd_event(VkKeyScan('I'), 1, 0, 0); keybd_event(VkKeyScan('I'), 1, KEYEVENTF_KEYUP, 0); keybd_event(VkKeyScan(' '), 1, 0, 0); keybd_event(VkKeyScan(' '), 1, KEYEVENTF_KEYUP, 0); keybd_event(VK_SHIFT, 1, 0, 0); keybd_event(VkKeyScan('T'), 1, 0, 0); keybd_event(VkKeyScan('T'), 1, KEYEVENTF_KEYUP, 0); keybd_event(VK_SHIFT, 1, KEYEVENTF_KEYUP, 0); keybd_event(VkKeyScan('I'), 1, 0, 0); keybd_event(VkKeyScan('I'), 1, KEYEVENTF_KEYUP, 0); keybd_event(VkKeyScan('P'), 1, 0, 0); keybd_event(VkKeyScan('P'), 1, KEYEVENTF_KEYUP, 0); keybd_event(VkKeyScan('S'), 1, 0, 0); keybd_event(VkKeyScan('S'), 1, KEYEVENTF_KEYUP, 0); keybd_event(VK_RETURN, 1, 0, 0); keybd_event(VK_RETURN, 1, KEYEVENTF_KEYUP, 0); { send '***' and ENTER } keybd_event(VK_SHIFT, 1, 0, 0); keybd_event(VkKeyScan('*'), 1, 0, 0); keybd_event(VkKeyScan('*'), 1, KEYEVENTF_KEYUP, 0); keybd_event(VkKeyScan('*'), 1, 0, 0); keybd_event(VkKeyScan('*'), 1, KEYEVENTF_KEYUP, 0); keybd_event(VkKeyScan('*'), 1, 0, 0); keybd_event(VkKeyScan('*'), 1, KEYEVENTF_KEYUP, 0); keybd_event(VK_SHIFT, 1, KEYEVENTF_KEYUP, 0); keybd_event(VK_RETURN, 1, 0, 0); keybd_event(VK_RETURN, 1, KEYEVENTF_KEYUP, 0); end; {...} Example 2: Virtual-Key Codes http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/hh/winui/vkeys_529f.asp The following table shows the symbolic constant names, hexadecimal values, and mouse or keyboard equivalents for the virtual-key codes used by the system. The codes are listed in numeric order. Symbolic constant name Value (hexadecimal) Mouse or keyboard equivalent VK_LBUTTON 01 Left mouse button VK_RBUTTON 02 Right mouse button VK_CANCEL 03 Control-break processing VK_MBUTTON 04 Middle mouse button (three-button mouse) VK_XBUTTON1 05 Windows 2000 or later: X1 mouse button VK_XBUTTON2 06 Windows 2000 or later: X2 mouse button — 07 Undefined VK_BACK 08 BACKSPACE key VK_TAB 09 TAB key — 0A–0B Reserved VK_CLEAR 0C CLEAR key VK_RETURN 0D ENTER key — 0E–0F Undefined VK_SHIFT 10 SHIFT key VK_CONTROL 11 CTRL key VK_MENU 12 ALT key VK_PAUSE 13 PAUSE key VK_CAPITAL 14 CAPS LOCK key VK_KANA 15 IME Kana mode VK_HANGUEL 15 IME Hanguel mode (maintained for compatibility; use VK_HANGUL) VK_HANGUL 15 IME Hangul mode — 16 Undefined VK_JUNJA 17 IME Junja mode VK_FINAL 18 IME final mode VK_HANJA 19 IME Hanja mode VK_KANJI 19 IME Kanji mode — 1A Undefined VK_ESCAPE 1B ESC key VK_CONVERT 1C IME convert VK_NONCONVERT 1D IME nonconvert VK_ACCEPT 1E IME accept VK_MODECHANGE 1F IME mode change r equest VK_SPACE 20 SPACEBAR VK_PRIOR 21 PAGE UP key VK_NEXT 22 PAGE DOWN key VK_END 23 END key VK_HOME 24 HOME key VK_LEFT 25 LEFT ARROW key VK_UP 26 UP ARROW key VK_RIGHT 27 RIGHT ARROW key VK_DOWN 28 DOWN ARROW key VK_SELECT 29 SELECT key VK_PRINT 2A PRINT key VK_EXECUTE 2B EXECUTE key VK_SNAPSHOT 2C PRINT SCREEN key VK_INSERT 2D INS key VK_DELETE 2E DEL key VK_HELP 2F HELP key 30 0 key 31 1 key 32 2 key 33 3 key 34 4 key 35 5 key 36 6 key 37 7 key 38 8 key 39 9 key — 3A–40 Undefined 41 A key 42 B key 43 C key 44 D key 45 E key 46 F key 47 G key 48 H key 49 I key 4A J key 4B K key 4C L key 4D M key 4E N key 4F O key 50 P key 51 Q key 52 R key 53 S key 54 T key 55 U key 56 V key 57 W key 58 X key 59 Y key 5A Z key VK_LWIN 5B Left Windows key (Microsoft® Natural® keyboard) VK_RWIN 5C Right Windows key (Natural keyboard) VK_APPS 5D Applications key (Natural keyboard) — 5E Reserved VK_SLEEP 5F Computer Sleep key VK_NUMPAD0 60 Numeric keypad 0 key VK_NUMPAD1 61 Numeric keypad 1 key VK_NUMPAD2 62 Numeric keypad 2 key VK_NUMPAD3 63 Numeric keypad 3 key VK_NUMPAD4 64 Numeric keypad 4 key VK_NUMPAD5 65 Numeric keypad 5 key VK_NUMPAD6 66 Numeric keypad 6 key VK_NUMPAD7 67 Numeric keypad 7 key VK_NUMPAD8 68 Numeric keypad 8 key VK_NUMPAD9 69 Numeric keypad 9 key VK_MULTIPLY 6A Multiply key VK_ADD 6B Add key VK_SEPARATOR 6C Separator key VK_SUBTRACT 6D Subtract key VK_DECIMAL 6E Decimal key VK_DIVIDE 6F Divide key VK_F1 70 F1 key VK_F2 71 F2 key VK_F3 72 F3 key VK_F4 73 F4 key VK_F5 74 F5 key VK_F6 75 F6 key VK_F7 76 F7 key VK_F8 77 F8 key VK_F9 78 F9 key VK_F10 79 F10 key VK_F11 7A F11 key VK_F12 7B F12 key VK_F13 7C F13 key VK_F14 7D F14 key VK_F15 7E F15 key VK_F16 7F F16 key VK_F17 80 F17 key VK_F18 81 F18 key VK_F19 82 F19 key VK_F20 83 F20 key VK_F21 84 F21 key VK_F22 85 F22 key VK_F23 86 F23 key VK_F24 87 F24 key — 88–8F Unassigned VK_NUMLOCK 90 NUM LOCK key VK_SCROLL 91 SCROLL LOCK key 92–96 OEM specific — 97–9F Unassigned VK_LSHIFT A0 Left SHIFT key VK_RSHIFT A1 Right SHIFT key VK_LCONTROL A2 Left CONTROL key VK_RCONTROL A3 Right CONTROL key VK_LMENU A4 Left MENU key VK_RMENU A5 Right MENU key VK_BROWSER_BACK A6 Windows 2000 or later: Browser Back key VK_BROWSER_FORWARD A7 Windows 2000 or later: Browser Forward key VK_BROWSER_REFRESH A8 Windows 2000 or later: Browser Refresh key VK_BROWSER_STOP A9 Windows 2000 or later: Browser Stop key VK_BROWSER_SEARCH AA Windows 2000 or later: Browser Search key VK_BROWSER_FAVORITES AB Windows 2000 or later: Browser Favorites key VK_BROWSER_HOME AC Windows 2000 or later: Browser Start and Home key VK_VOLUME_MUTE AD Windows 2000 or later: Volume Mute key VK_VOLUME_DOWN AE Windows 2000 or later: Volume Down key VK_VOLUME_UP AF Windows 2000 or later: Volume Up key VK_MEDIA_NEXT_TRACK B0 Windows 2000 or later: Next Track key VK_MEDIA_PREV_TRACK B1 Windows 2000 or later: Prev Track key VK_MEDIA_STOP B2 Windows 2000 or later: Stop Media key VK_MEDIA_PLAY_PAUSE B3 Windows 2000 or later: Play/Pause Media key VK_LAUNCH_MAIL B4 Windows 2000 or later: Start Mail key VK_LAUNCH_MEDIA_SELECT B5 Windows 2000 or later: Select Media key VK_LAUNCH_APP1 B6 Windows 2000 or later: Start Application 1 key VK_LAUNCH_APP2 B7 Windows 2000 or later: Start Application 2 key — B8-B9 Reserved VK_OEM_1 BA Windows 2000 or later: For the US standard keyboard, the ';:' key VK_OEM_PLUS BB Windows 2000 or later: For any country/region, the '+' key VK_OEM_COMMA BC Windows 2000 or later: For any country/region, the ',' key VK_OEM_MINUS BD Windows 2000 or later: For any country/region, the '-' key VK_OEM_PERIOD BE Windows 2000 or later: For any country/region, the '.' key VK_OEM_2 BF Windows 2000 or later: For the US standard keyboard, the '/?' key VK_OEM_3 C0 Windows 2000 or later: For the US standard keyboard, the '`~' key — C1–D7 Reserved — D8–DA Unassigned VK_OEM_4 DB Windows 2000 or later: For the US standard keyboard, the '[{' key VK_OEM_5 DC Windows 2000 or later: For the US standard keyboard, the '\|' key VK_OEM_6 DD Windows 2000 or later: For the US standard keyboard, the ']}' key VK_OEM_7 DE Windows 2000 or later: For the US standard keyboard, the 'single-quote/double-quote' key VK_OEM_8 DF—E0 Reserved - E1 OEM specific VK_OEM_102 E2 Windows 2000 or later: Either the angle bracket key or the backslash key on the RT 102-key keyboard - E3–E4 OEM specific VK_PROCESSKEY E5 Windows 95/98, Windows NT 4.0, Windows 2000 or later: IME PROCESS key - E6 OEM specific VK_PACKET E7 Windows 2000 or later: Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. — E8 Unassigned - E9–F5 OEM specific VK_ATTN F6 Attn key VK_CRSEL F7 CrSel key VK_EXSEL F8 ExSel key VK_EREOF F9 Erase EOF key VK_PLAY FA Play key VK_ZOOM FB Zoom key VK_NONAME FC Reserved for future use VK_PA1 FD PA1 key VK_OEM_CLEAR FE Clear key