Click here to Skip to main content
Click here to Skip to main content

SendKeys in C++

, 14 Jun 2004
Rate this:
Please Sign up or sign in to vote.
A C++ port and enhancement of C#'s / VB's SendKeys function.


One day I needed to send keys to another application in order to automate a task from my C++ program, but after some research, I found no easy way to do that in C++ and all what was found is reference to VB's or C#'s SendKeys. However, one of the search results returned sndkeys32.pas which is a Delphi code version of the SendKeys() written by Ken Henderson back in 1995.

Since I know Delphi and wanted this same functionality in C++, I decided to port and enhance the code to make it fit my needs. The remainder of the article will explain the concept of sending keys in Win32 and will show you how to use the code in order to send keys in just two lines of code!

Hope you find this article useful.

Key sending concept in Win32

The core functionality of sending keys in CSendKeys revolves around the usage of the keybd_event() Win32 API function.

The keybd_event() produces a keystroke, however the keyboard driver's interrupt handles the calls to this function, which means we can send almost any key combination with less limitations.

In brief, it allows you to send a virtual key, defined in winuser.h as VK_XXX, and a flag which denotes a KeyDown, KeyUp or state to tell if the VKey is an extended key or not.

Normal characters are translated into virtual keys using the VkKeyScan() which takes a CHAR and returns a WORD denoting a VK.

When you send a key, it will be depressed until you send it again with the KEYEVENTF_KEYUP flag.

Here is a small snippet that allows you to send the ALT-TAB sequence:

  // press DOWN "Alt-Tab"
  keybd_event(VK_MENU, 0, 0, 0);
  keybd_event(VK_TAB, 0, 0, 0);


  // stop pressing "Alt-Tab"
  keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
  keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0);

As you see, in order to send this simple keys combination, 4 lines of coded were needed. Here is where CSendKeys comes to simplify this task.

How to use the code

In short, the code can be used as:
#include "SendKeys.h"
CSendKeys sk;
// Send "Hello world!"
sk.SendKeys("Hello world!");
// Run notepad


CSendKeys is designed in a way to maintain certain compatibility with C#'s SendKeys while also adding more functionality. So if you used C#'s SendKeys.Send() or VB's before then using CSendKeys becomes easier.

Each key is represented by one or more characters. To specify a single keyboard character, use the character itself. For example, to represent the letter 'a', pass in the string "a" to the method. Naturally to represent a string of characters just pass them in order as "hello".

If you want to send modifier keys such as the SHIFT, ALT, CONTROL or WINKEY keys in addition to normal keys, you might want to use any of the characters defined in Table 3.

For example, if you want to send "A" you usually press Shift+A, which is equivalent to sending these key strokes: "+a" , similarly to send the "~" you would press Shift+` which is equivalent to key strokes "+`" or simply "{TILDE}" (Table 1.b).

All characters in Table 3 are reserved and have special meaning in addition to the left/right parenthesis/braces.

The parenthesis are used to associate a given modifier or modifiers with a group of characters, for example to send the "HELLO", you would describe as "+(hello)" which informs CSendKeys to depress the SHIFT key while sending the following keys group. Whereas the braces are used to enclose any of the keys displayed in Table 1 and 2.

The sent keys are sent to no specific application, instead they are just pressed and whatever application has the keyboard input will take the keys.

In order to send the keys to a specific window/application please use either of the methods:

// 1. activate an application using its handle

// 2. activate an application given its window title

/// 3. activate an application given either or both of its window title/class
sk.AppActivate(NULL, "TheClass"); // NULL means this criteria is not avail

// 4. via SendKeys method
sk.SendKeys("{appactivate Notepad}hello");

The following table is a slightly modified version of the MSDN/SendKeys help:

Key Code
PRINT SCREEN {PRTSC} (reserved for future use)
F1 {F1}
F2 {F2}
F3 {F3}
F4 {F4}
F5 {F5}
F6 {F6}
F7 {F7}
F8 {F8}
F9 {F9}
F10 {F10}
F11 {F11}
F12 {F12}
F13 {F13}
F14 {F14}
F15 {F15}
F16 {F16}
Keypad add {ADD}
Keypad subtract {SUBTRACT}
Keypad multiply {MULTIPLY}
Keypad divide {DIVIDE}
(table 1.a)

The following are my additions:

Key Code
+ {PLUS}
@ {AT}
WINKEY {WIN} equivalent to {LWIN}
(table 1.b)

In addition to this, I have added some special keys that act like commands:

Command Syntax Action
{VKEY X} Sends the VKEY of value X.

Very useful if you don't want to recompile CSendKeys and add new Vkey to the hardcoded special keys table.

For example, {VKEY 13} is equivalent to VK_RETURN.

{BEEP X Y}} Beeps with a frequency of X and a duration of Y milliseconds.
{DELAY X} Delays sending the next key of X milliseconds. After the delaying the following key, the subsequent keys will not be further delayed unless there is a default delay value (see DELAY=X).

Example: {DELAY 1000} <-- delays subsequent key stroke for 1 second.

{DELAY=X} Sets the default delay value to X milliseconds. This will cause every key to be delayed X ms.

If a value is already set and you specify {DELAY Y} you will have your following key delay Y ms but the subsequent keys will be delayed X ms.

Example: {DELAY=1000} <-- all subsequent keys will be delayed for 1 second.

{APPACTIVATE WindowTitle} Activates an application using is WindowTitle.

Very useful if you want to send different keys to different applications.

(table 2)

Key Code
(table 3)

Here are some examples:

Keystrokes Description
{DELAY=50}@rnotepad~hello world%ha
  1. set delay after each character to 50 ms
  2. WINKEY+R to invoke the run dialog

  3. type "notepad" and press ENTER
  4. Type "hello world"
  5. Invoke Alt+H then press "A" to invoke the about dialog of notepad
{delay=100}{appactivate Calculator}{ESC}5*7~{beep 1000 500}^c{appactivate Notepad}^a{DEL}Result of 5*7 is: ^v Given that "Calc.exe" and "Notepad.exe" are running:
  1. set delay to 100 ms
  2. activate calculatr
  3. press ESC to clear previous result
  4. type in 5*7 then press ENTER
  5. beep for 500ms with a frequency of 1000
  6. press CTRL+C to copy result
  7. activate notepad
  8. press CTRL+A then DEL in notepad to delete previously written text
  9. type in a phrase then press CTRL+V to paste the copied result
  1. Press NUM,CAPS,SCROll lock in order
  2. Turn them off in reverse order
{DELAY=500}% {DOWN 5}
  1. press ALT+SPACE
  2. press DOWN key 5 times

For more examples see the accompanying sample code.

  • 04/19/2004
    • Initial version development
  • 04/21/2004
    • Added number of times specifier to special keys
    • Added {BEEP X Y}
    • Added {APPACTIVATE WindowTitle}
    • Added CarryDelay() and now delay works properly with all keys
    • Added SetDelay() method
    • Fixed code in AppActivate that allowed to pass both NULL windowTitle/windowClass
  • 05/21/2004
    • Fixed a bug in StringToVKey() that caused the search for RIGHTPAREN to be matched as RIGHT
    • Adjusted code so it compiles w/ VC6
  • 05/24/2004
    • Added Unicode support



This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


About the Author

Elias Bachaalany
Web Developer
United States United States
Elias (aka lallousx86, @0xeb) has always been interested in the making of things and their inner workings.
His computer interests include system programming, reverse engineering, writing libraries, tutorials and articles.
In his free time, and apart from researching, his favorite reading topics include: dreams, metaphysics, philosophy, psychology and any other human/mystical science.
Former employee of Hex-Rays (the creators of IDA Pro), was responsible about many debugger plugins, IDAPython project ownership and what not.
Elias currently works at Microsoft as a software security engineer.
More articles and blog posts can be found here:

Comments and Discussions

GeneralRe: Bug in code PinmemberRafal07BC10-Feb-10 3:24 
GeneralRe: Bug in code Pinmemberlarkyap13-Dec-11 3:34 
Questiondead diaeresis (umlaut) Pinmemberbustr5-Mar-09 13:25 
GeneralProblem with ESC key [modified] Pinmembervolodim21-Nov-08 13:03 
GeneralTrying to make it work in Borland Bilder or BloodShed Dev-Cpp Pinmemberlsanczyk18-Sep-08 8:42 
GeneralReading Text... PinmemberPankajB10-Sep-08 7:31 
RantRe: Reading Text... PinmvpJames R. Twine11-Sep-08 8:50 
GeneralRe: Reading Text... PinmemberPankajB11-Sep-08 17:28 
GeneralHelp with using it please PinmemberAaron Feldspar13-Jun-08 13:01 
heres ma source code:
#include "cstdlib"
#include "iostream"
#include "windows.h"
#include "sendkeys.h"
using namespace std;
int main(int argc, char *argv[])
int menuStatus;
menuStatus = 1;
cout << "Welcome to the Harvest Moon Menu" << endl << endl;
cout << "Which game would you like to play?" << endl;
cout << "1:      Harvest Moon Game Boy 1" << endl; 
cout << "2:      Harvest Moon Game Boy 2" << endl;
cout << "3:      Harvest Moon Game Boy 3" << endl;
cout << "4:      Harvest Moon Friends of Mineral Town" << endl;
cout << "5:      Harvest Moon 64" << endl;
cin >> menuStatus;
if(menuStatus == 1)
else if(menuStatus == 2)
else if(menuStatus == 3)
else if(menuStatus == 4)
else if(menuStatus == 5)
    return 0;
    return EXIT_SUCCESS;
I'm getting an annoying result in the output window Frown | :(
expect primary-expression before '.' token
i also tried to use:
CSendKeys sk;
but that didn't help Hmmm | :|
I'm new to programming, and figured this would be a good way to practice ^^. Any help you could offer would be greatly appreciated.
I'm using dev c++ v on windows xp: service pack 2.
again, thanks in advance! Smile | :)
edit: Eep! just noticed that message on the bottom D:!!
What's up with that :S
GeneralNeed .dll version that works with Windows Scripting Host PinmemberSharkD9-Jun-08 7:07 
QuestionCompilation error - Microsoft Visual C++ .NET PinmemberMayank Shridhar3-Jan-08 3:21 
GeneralRe: Compilation error - Microsoft Visual C++ .NET PinmemberValerie Anders3-Jan-08 4:31 
AnswerRe: Compilation error - Microsoft Visual C++ .NET PinmemberIrken Santillan9-Jun-10 18:30 
AnswerRe: Compilation error - Microsoft Visual C++ .NET PinmemberAdminSam16-Jan-12 0:10 
Questionerror... :( Pinmemberjax509-Dec-07 17:23 
GeneralSending Text to Active Application Pinmembervikrant kpr11-Oct-07 9:10 
GeneralRe: Sending Text to Active Application PinmemberIrken Santillan9-Jun-10 18:23 
GeneralI have a C# version if you want [modified] PinmemberRobert Gasparotto11-Sep-07 16:34 
GeneralRe: I have a C# version if you want Pinmemberlallous11-Sep-07 19:41 
GeneralRe: I have a C# version if you want PinmemberRobert Gasparotto12-Sep-07 18:07 
GeneralRe: I have a C# version if you want Pinmemberleeand22-Jul-11 2:49 
QuestionRe: I have a C# version if you want PinmemberFuzzychaos14-Oct-07 22:24 
AnswerRe: I have a C# version if you want [modified] PinmemberRobert Gasparotto16-Oct-07 19:33 
GeneralRe: I have a C# version if you want Pinmemberalper ebicoglu4-Oct-08 11:31 
AnswerRe: I have a C# version if you want PinmemberFuzzychaos24-Oct-07 23:44 
GeneralRe: I have a C# version if you want PinmemberdzCepheus26-Nov-07 20:06 
GeneralRe: I have a C# version if you want Pinmemberhdjim5-Dec-07 3:49 
GeneralRe: I have a C# version if you want PinmemberInternetIllusion3-Jun-10 5:08 
GeneralRe: I have a C# version if you want Pinmemberr.guerzoni20-Mar-08 3:41 
GeneralRe: I have a C# version if you want Pinmembermanishjain764-May-08 22:27 
GeneralRe: I have a C# version if you want PinmemberGicks16-Jun-08 6:56 
GeneralRe: I have a C# version if you want PinmemberF1dave17-Jun-08 10:53 
GeneralRe: I have a C# version if you want PinmemberTolis_200123-Aug-08 23:31 
GeneralRe: I have a C# version if you want PinmemberFriedemann30-Aug-08 9:41 
GeneralRe: I have a C# version if you want Pinmemberstefan stoian5-Sep-08 10:48 
GeneralRe: I have a C# version if you want Pinmemberr.guerzoni24-Sep-08 3:44 
GeneralRe: I have a C# version if you want PinmemberMicah Peterson28-Apr-09 16:36 
Generalproblem with key up events PinmemberAndrew Palka6-Jul-07 23:03 
QuestionI am getting error while including in my project. Pinmembershivditya14-Jun-07 5:58 
Questioncycles Pinmemberczmelak20-May-07 22:33 
GeneralRe: cycles Pinmemberdiminisher7-Mar-08 3:04 
QuestionSending to a specific application with the need to give the application input focus. PinmemberRod_Stein24-Apr-07 13:46 
AnswerRe: Sending to a specific application with the need to give the application input focus. Pinmemberlallous25-Apr-07 5:52 
Questionhelp needed Pinmemberkse15-Jan-07 4:54 
Questionwhy it can't be compiled in dev-C++ Pinmembersuna59921-Dec-06 5:35 
AnswerRe: why it can't be compiled in dev-C++ Pinmemberlallous27-Dec-06 23:22 
GeneralRe: why it can't be compiled in dev-C++ Pinmembersuna59928-Dec-06 1:33 
GeneralRe: why it can't be compiled in dev-C++ Pinmemberlallous1-Jan-07 20:51 
GeneralRe: why it can't be compiled in dev-C++ Pinmembersuna5991-Jan-07 21:47 
GeneralRe: why it can't be compiled in dev-C++ Pinmembersuna5999-Jan-07 21:44 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web04 | 2.8.140827.1 | Last Updated 15 Jun 2004
Article Copyright 2004 by Elias Bachaalany
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid