I. Introduction▲
Les raccourcis clavier ou HotKey sont semblables aux accélérateurs clavier à la différence qu'ils peuvent être modifiés pendant l'exécution du programme et qu'ils sont actifs même si l'application n'a pas le focus clavier.
II. Création d'un raccourci clavier▲
Pour créer un raccourci clavier, on utilise la fonction RegisterHotKey, dont voici un exemple d'utilisation :
RegisterHotKey
(
hwnd, HK_CTRL_H, MOD_CONTROL, '
H
'
);
Elle prend comme paramètres dans l'ordre suivant : le handle de la fenêtre qui réceptionne le raccourci clavier, puis une constante entière qui sera l'identificateur du raccourci, puis un entier qui est la combinaison de constante qui indique si une touche étendue est enfoncée, puis le code (virtual key code) de la touche de raccourci.
Les constantes de touches étendues sont : MOD_ALT pour la touche Alt, MOD_CONTROL pour la touche Ctrl, MOD_SHIFT pour la touche majuscule et MOD_WIN pour la touche Windows.
III. Réception du raccourci clavier▲
Quand une HotKey enregistrée est actionnée, Windows envoie un message WM_HOTKEY à la fenêtre, ce message contient dans son paramètre wParam l'identificateur de la HotKey.
case
WM_HOTKEY:
if
(
wParam==
HK_CTRL_H)
MessageBox
(
hwnd, "
Evenement Hot Key : Ctrl H
"
, "
Titre
"
, MB_OK );
return
0
;
Pour retirer une HotKey on appelle la fonction UnregisterHotKey avec comme paramètre le handle de fenêtre suivi de l'identificateur de la HotKey.
IV. Code complet▲
#include <windows.h>
#define IDM_QUIT 100
#define HK_CTRL_H 200
LRESULT CALLBACK MainWndProc
(
HWND, UINT, WPARAM, LPARAM);
int
WINAPI WinMain
(
HINSTANCE hinstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int
nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wc;
HMENU hMenu, hSousMenu;
wc.style =
0
;
wc.lpfnWndProc =
MainWndProc;
wc.cbClsExtra =
0
;
wc.cbWndExtra =
0
;
wc.hInstance =
hinstance;
wc.hIcon =
NULL
;
wc.hCursor =
LoadCursor
(
NULL
, IDC_ARROW);
wc.hbrBackground =
(
HBRUSH)(
COLOR_APPWORKSPACE+
1
);
wc.lpszMenuName =
NULL
;
wc.lpszClassName =
"
mainWinClass
"
;
if
(!
RegisterClass
(&
wc)) return
FALSE;
hSousMenu =
CreateMenu
(
);
AppendMenu
(
hSousMenu, MF_STRING, IDM_QUIT, "
Quitter
\t
Atl-F4
"
);
hMenu =
CreateMenu
(
);
AppendMenu
(
hMenu,MF_POPUP,(
UINT)hSousMenu,"
Fichier
"
);
hwnd =
CreateWindow
(
"
mainWinClass
"
, "
Titre
"
, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 400
, 300
,
NULL
, hMenu, hinstance, NULL
);
if
(!
hwnd) return
FALSE;
ShowWindow
(
hwnd, nCmdShow);
while
(
GetMessage
(&
msg, NULL
, 0
, 0
))
{
TranslateMessage
(&
msg);
DispatchMessage
(&
msg);
}
return
msg.wParam;
}
/**
***************************************************************************
*/
LRESULT CALLBACK MainWndProc
(
HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch
(
uMsg)
{
case
WM_CREATE:
RegisterHotKey
(
hwnd, HK_CTRL_H, MOD_CONTROL, '
H
'
);
return
0
;
case
WM_HOTKEY:
if
(
wParam==
HK_CTRL_H)
MessageBox
(
hwnd, "
Evenement Hot Key : Ctrl H
"
, "
Titre
"
, MB_OK );
return
0
;
case
WM_COMMAND:
if
(
LOWORD
(
wParam) ==
IDM_QUIT) PostMessage
(
hwnd, WM_CLOSE,0
,0
);
return
0
;
case
WM_DESTROY:
UnregisterHotKey
(
hwnd, HK_CTRL_H);
PostQuitMessage
(
0
);
return
0
;
default
:
return
DefWindowProc
(
hwnd, uMsg, wParam, lParam);
}
}
Ce code a été testé sous VC++, CodeBlocks(Mingw).
À vos PC.