Windows API Single Key Hotkeys
I have a love hate relationship with the Windows Documentation and with how MSDN is designed. I could spend hours trying to find the information I need and even then there will be information missing. To give you an idea of what I mean, I wanted to make a shortcut key that only requires a single key instead of having it use Shift, Ctrl, Windows Key or other modifiers.
In their documentation they don’t mention anywhere that modifiers are not required. From what the documentation shows, it appears that you must use one of the four available modifiers. I did a little bit of testing to see if I could make it so a modifier wouldn’t be required.
The basic syntax for creating a global shortcut hot key in Windows is as follows.
BOOL WINAPI RegisterHotKey(
_In_opt_ HWND hWnd,
_In_ int id,
_In_ UINT fsModifiers,
_In_ UINT vk
);
For the 3rd parameter, UINT fsModifiers
you have a few options such
as using MOD_ALT
, MOD_CONTROL
, MOD_WIN
and some others. If you
would like to see the full documentation on this function along with
the options you can visit the MSDN
Page.
What the documentation forgets to mention though, is if you leave
fsModifiers
as 0x00
or NULL
no modifiers are used and your global
shortcut key is registered. Below is an example showing this off this
method using the hotkey of F8
. Keep in mind that when a keyboard
shortcut is registered, that key will not be able to perform it’s
normal action. If you set the shortcut key to be a letter, the user
won’t be able to type that letter in any other programs. Make sure you
only define single keys that the user won’t normally press, such as the
F1 - F12
keys.
#include <stdio.h>
#include <windows.h>
int main(int argc, char *argv[]) {
if(!RegisterHotKey(NULL,1,0,VK_F8)) {
printf("Failed to Register Hotkey - %lu\n",GetLastError());
return -1;
}
MSG msg = {0};
while(GetMessage(&msg,NULL,0,0) != 0) {
if(msg.message == WM_HOTKEY) {
printf("Hotkey Received\n");
}
}
return 0;
}
And if you want the code I used to compile this using GCC, it’s gcc
-Wall -o hotkey.exe hotkey.c
.