[Première partie que tu peux sauter si tu sais déjà ce que sont et font les messages]
Si ton code exclut les MFC, la procédure va être la suivante :
chaque fois que quelque chose arrive à ta fenêtre (un clic, un appui de touche, un message d'une autre appli ou du système) et que Windows ne sait pas quoi faire avec (ou que tu lui as demandé de ne rien faire), un message qui décrit l'action est mis dans une queue ; il te revient ensuite de ramasser les messages pour savoir ce qui s'est passé et de prendre les actions nécessaires. C'est comme un événement VB ou MFC, mais en plus rudimentaire.
tu as une fonction de callback de prototype (le nom est libre) :
1. LRESULT CALLBACK WindowProc(
2.
3. HWND hwnd,
4. UINT uMsg,
5. WPARAM wParam,
6. LPARAM lParam
7. );
qui va traiter les messages par un switch ou un if/else if sur le message uMsg, qui a été envoyé à la fenêtre hwnd avec pour paramètres les deux autres variables.
Au moment où tu crées ta classe de fenêtre (avec
RegisterClass( const WNDCLASS *) ), il faut informer windows que tu souhaites que les messages reçus soient traités par cette fonction.
Pour ça, mets un pointeur vers ta fonction dans le membre lpfnWndProc du WNDCLASS que tu passes à RegisterClass().
[Là, ça devient intéressant !]
Pour les combinaisons de touches (raccourcis), il faut que tu crées des "accelerator keys", qui sont stockées dans une table que tu crées avec
1. HACCEL CreateAcceleratorTable(
2.
3. LPACCEL lpaccl,
4. int cEntries
5. );
6. // LPACCEL est un tableau de structures ACCEL qui contiennent la (les) touche(s) de contrôle et le caractère du raccourci
7. // cEntries est la taille du tableau
8. // cette fonction renvoie un handle vers la table
à l'ouverture de l'appli et détruis (avec DestroyAcceleratorTable(HACCEL) à sa fermeture.
enfin, ton programme doit contenir la boucle de traitement de la queue des messages :
1. // récup du message
2. while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
3. {
4. if (bRet == -1)
5. {
6. // pas cool
7. }
8. else
9. {
10. // si le message est un raccourci clavier, le traduire en WM_COMMAND (hWnd : handle de ta fenêtre, hAccTable : la table que tu as créée plus tôt) et appeler la callback
11. if( !TranslateAccelerator( hWnd, hAccTable, &msg)
12. {
13. // sinon, traduire les codes Virtual Key en code ASCII (facultatif)
14. TranslateMessage(&msg);
15. // et appelle la callback
16. DispatchMessage(&msg);
17. }
18. }
19. }
J'espère ne pas avoir dit trop de bêtises ni n'en avoir oublié...
Je t'invite à consulter la MSDN pour plus de précisions !