domingo, 9 de mayo de 2010

Usando Hotkeys con C, C++

Las teclas globales o hotkeys son teclas o combinaciones de teclas cuya pulsación puede ser captada sin que el programa tenga el foco.

El programa de ejemplo que muestro, al ejecutarse no veras nada, ni ventana, ni consola, se trata de un proceso que capta unas teclas (mira las funciones RegisterHotKey), para salir pulsa la tecla de escape y tendría que aparecer un mensajito con el texto "bye bye".

#include <windows.h>

#define CTRL_ALT_F1 101
#define CTRL_F2     102
#define ALT_F3      103
#define CTRL_UP     104
#define CTRL_DOWN   105
#define CTRL_RIGHT  106
#define CTRL_LEFT   107
#define EXIT_KEYS   108

LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);
char Name[] = "HotKey demo - DavidXL";

int WINAPI WinMain ( HINSTANCE hInst,HINSTANCE hPrevInst,
                     LPSTR lpszArgument,int nFunsterStil )
{
    HWND hwnd;
    MSG messages;

    WNDCLASSEX wincl = {sizeof(WNDCLASSEX),0,WinProc,0,0,hInst,0,0,0,0,Name,0};
    if (!RegisterClassEx (&wincl)) return 1;
    hwnd = CreateWindowEx(0,Name,Name,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
                          CW_USEDEFAULT,0,0,HWND_DESKTOP,NULL,hInst,NULL );

    RegisterHotKey(hwnd, CTRL_ALT_F1, MOD_CONTROL|MOD_ALT, VK_F1);
    RegisterHotKey(hwnd, CTRL_F2, MOD_CONTROL, VK_F2);
    RegisterHotKey(hwnd, ALT_F3, MOD_ALT, VK_F3);
    RegisterHotKey(hwnd, CTRL_UP, MOD_CONTROL, VK_UP);
    RegisterHotKey(hwnd, CTRL_DOWN, MOD_CONTROL, VK_DOWN);
    RegisterHotKey(hwnd, CTRL_RIGHT, MOD_CONTROL, VK_RIGHT);
    RegisterHotKey(hwnd, CTRL_LEFT, MOD_CONTROL, VK_LEFT);
    RegisterHotKey(hwnd, EXIT_KEYS, 0 , VK_ESCAPE);

    while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
    return messages.wParam;
}

LRESULT CALLBACK WinProc( HWND hwnd, UINT message,
                                  WPARAM wParam, LPARAM lParam )
{
    switch (message)
    {
        case WM_HOTKEY:
            switch(wParam)
            {
                  case CTRL_ALT_F1:
                       MessageBox(NULL, "CTRL_ALT_F1", Name, MB_OK);
                  break;
                  case CTRL_F2:
                       MessageBox(NULL, "CTRL_F2", Name, MB_OK);
                  break;
                  case ALT_F3:
                       MessageBox(NULL, "ALT_F3", Name, MB_OK);
                  break;
                  case CTRL_UP:
                       MessageBox(NULL, "CTRL_UP", Name, MB_OK);
                  break;
                  case CTRL_DOWN:
                       MessageBox(NULL, "CTRL_DOWN", Name, MB_OK);
                  break;
                  case CTRL_RIGHT:
                       MessageBox(NULL, "CTRL_RIGHT", Name, MB_OK);
                  break;
                  case CTRL_LEFT:
                       MessageBox(NULL, "CTRL_LEFT", Name, MB_OK);
                  break;
                  case EXIT_KEYS:
                       MessageBox(NULL, "bye bye", Name, MB_OK);
                       PostQuitMessage(0);
                  break;
            }
            break;
        case WM_DESTROY:
            PostQuitMessage (0);
            break;
        default:
            return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
}
Comparte o puntua esta publicación ▼

1 comentarios:

Cosmo José dijo...

Muito interessante. Obrigado!

Publicar un comentario