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++ 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.