How to Detect Keypress in Windows Using C++?

In Windows programming, detecting keypress events is a fundamental requirement for many applications like games, user interfaces, and many more. In this article, we will learn how to detect keypress events in Windows using C++.

Example

Input:
Press any key

Output:
Pressed Key: G (ASCII value: 71) 
Pressed Key: F (ASCII value: 70) 
Pressed Key: G (ASCII value: 71)

Check if a Key is Pressed in C++

To detect keypress events in Windows using C++, we can use the GetAsyncKeyState() function that is used to determine whether a key is pressed or not at the time when the function is called. The function is defined inside the Windows API, which is declared inside the windows.h file. Following is the syntax to use the GetAsyncKeyState function:

Syntax

SHORT  GetAsyncKeyState(  _In_ int vKey );

where:

  • vKey: is a virtual key code for every key on the keyboard. The value of vkey can range from 0x01 to 0xFE.
  • return value: Short integer whose most significant bit denotes the key’s current state and the least significant bit represents the previous state of the key. If the most significant bit is set it means that the key is currently pressed .

To detect keypress in windows using the GetAsyncKeyState() function we can follow the below approach:

Approach

  • Run an infinite loop using while(true) to check for keypress events continuously
  • Iteratre through all possible key codes from 0 to 255 using a for loop.
  • For each key code
    • Use the GetAsyncKeyState() function to check if the corresponding key is pressed or not
  • If the key is pressed
    • Print a message indicating which key is pressed along with it’s key code
  • Add a small delay using sleep() function to avoid high CPU usage.

C++ Program to Check if a Key is Pressed in Windows

The below example demonstrates the use of the GetAsyncKeyState function to detect a keypress in a Windows environment using C++:

C++
// C++ Program to Detect Keypress in Windows
// ggfgc++heahhellogfg
#include <iostream>
#include <windows.h>
using namespace std;

int main()
{
    cout << " Press Any Key:" << endl;
    while (true) {
        // Iterate through all possible key codes (0 to 255)
        for (int keyCode = 0; keyCode < 256; ++keyCode) {
            // Check if the key with keyCode is currently
            // pressed
            if (GetAsyncKeyState(keyCode) & 0x8000) {
                // Convert the key code to ASCII character
                char keyChar = static_cast<char>(keyCode);
                cout << "Pressed Key: " << keyChar
                     << " (ASCII value: " << keyCode << ")"
                     << endl;
            }
        }

        // Add a small delay to avoid high CPU usage
        Sleep(100);
    }

    return 0;
}


Output

Press Any Key:
Pressed Key: H (ASCII value: 72)
Pressed Key: E (ASCII value: 69)
Pressed Key: L (ASCII value: 76)
Pressed Key: L (ASCII value: 76)
Pressed Key: O (ASCII value: 79)
Pressed Key: G (ASCII value: 71)
Pressed Key: F (ASCII value: 70)
Pressed Key: G (ASCII value: 71)

Time Complexity: O(1), because the for loop runs for constant 256 times.
Auxiliary Space: O(1), as no extra space is used.