Capítulo 58 Control Hot Key

Ejemplo Hot Key

Vimos el tema de las hot keys en el capítulo 34.

Una hot key es una tecla, o combinación de teclas, que tiene asignada una función especial y directa.

El control Hot Key permite capturar o modificar una de estas combinaciones de teclas.

Insertar durante la ejecución

Como todos los controles, los controles Hot Key también se pueden insertar en una ventana o diálogo durante la ejecución. Igual que con el resto de controles, tan sólo tendremos que usar las funciones CreateWindow o CreateWindowEx indicaando en la clase de ventana el valor HOTKEY_CLASS:

    hFont = CreateFont(-14, 0, 0, 0, 0, FALSE, FALSE, FALSE, 1, 0, 0, 0, 0, ("Ms Shell Dlg"));
    CreateWindowEx(0, HOTKEY_CLASS, NULL,
        WS_CHILD | WS_VISIBLE | WS_TABSTOP,
        80,10,220,20,
        hwnd, (HMENU)ID_HOTKEY,
        hInstance, NULL);
    SendDlgItemMessage(hwnd, ID_HOTKEY, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(FALSE, 0));

Estos controles no tienen estilos específicos, tan sólo podremos usar los estilos más genéricos.

En el parámetro hMenu, como siempre, indicaremos el identificador del control.

Si queremos modificar la fuente usaremos el mensaje WM_SETFONT, y hay que recordar liberar el recurso antes de terminar el programa, usando DeleteObject.

Insertar desde fichero de recursos

Se usa un control general CONTROL, con la clase HOTKEY_CLASS, y los estilos generales que queramos aplicar.

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_DIALOG1 DIALOG 0, 0, 288, 64
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "Ms Shell Dlg"
{
    LTEXT           "Hot key:", 0, 10, 4, 28, 9, SS_LEFT, WS_EX_LEFT
    CONTROL         "", 0, HOTKEY_CLASS, WS_TABSTOP, 9, 20, 267, 14, WS_EX_LEFT
    PUSHBUTTON      "Cancelar", IDCANCEL, 65, 42, 50, 14, 0, WS_EX_LEFT
    DEFPUSHBUTTON   "Aceptar", IDOK, 9, 42, 50, 14, 0, WS_EX_LEFT
}

Asignar valor al control

Para asignar un valor a un control Hot Key usaremos el mensaje HKM_SETHOTKEY.

En wParam indicaremos el valor de la combinación de teclas, especificando en el byte de menor peso de la palabra de menor peso el valor de tecla virtual, y en el byte de mayor peso de la palabra de menor peso el modificador o combinación de modificadores.

Disponemos de la macro MAKEWPARAM para crear un valor de wParam a partir de dos palabras de 16 bits. Por otra parte, la macro MAKEWORD nos sirve para crear una palabra de 16 bits a partir de dos valores de 8 bits.

Los modificadores de tecla virtual disponibles son:

ValorSignificado
HOTKEYF_ALTTecla ALT
HOTKEYF_CONTROLTecla CONTROL
HOTKEYF_EXTTecla extendida
HOTKEYF_SHIFTTecla SHIFT
WPARAM key;
...
    key = MAKEWPARAM(MAKEWORD('F', HOTKEYF_SHIFT | HOTKEYF_ALT), 0);
    SendDlgItemMessage(hwnd, ID_HOTKEY, HKM_SETHOTKEY, key, 0);

Recuperar valor del control

Para recuperar el valor actual de un control Hot Key usaremos el mensaje HKM_GETHOTKEY, sin parámetros.

El valor retornado es análogo al que usamos en wParam para asignar el contenido del control. En el byte de menor peso de la palabra de menor peso se devolverá el valor de la tecla virtual, y en el byte de mayor peso de la palabra de menor peso, la combinación de modificadores.

    key = SendDlgItemMessage(hwnd, ID_HOTKEY, HKM_GETHOTKEY, 0, 0);

Reglas

Podemos definir ciertas reglas para evitar que el usuario use ciertas combinaciones de teclas. Para ello usaremos el mensaje HKM_SETRULES. En el parámetro wParam indicaremos una combinación de valores que codifican las combinaciones de teclas inválidas. En wParam indicaremos una combinación de modificadores que se combinarán con las teclas pulsadas por el usuario usando el operador de bits OR.

Por ejemplo, si queremos que el usuario no pueda introducir valores de hot keys de teclas sin modificadores o con el modificador SHIFT, indicaremos en wParm el valor HKCOMB_NONE | HKCOMB_S. Tendremos que indicar cómo modificar la selección de usuario indicando qué modificadores queremos usar en ese caso, si usamos el valor HOTKEYF_ALT en lParam, cualquier entrada del usuario de teclas sin modificadores, o con el modificar SHIFT, se sustituirá por la misma tecla más la tecla ALT.

Las banderas que sirven para especificar las combinaciones de teclas inválidas son las siguientes:

ValorSignificado
HKCOMB_AALT
HKCOMB_CCTRL
HKCOMB_CACTRL+ALT
HKCOMB_NONETeclas sin modificar
HKCOMB_SSHIFT
HKCOMB_SASHIFT+ALT
HKCOMB_SCSHIFT+CTRL
HKCOMB_SCASHIFT+CTRL+ALT

Por ejemplo:

    SendDlgItemMessage(hwnd, ID_HOTKEY, HKM_SETRULES, (WPARAM)HKCOMB_NONE | HKCOMB_S, (LPARAM)HOTKEYF_ALT);

Asignar una hot key a una ventana

Además de las hot keys que se explicaron en el capítulo 34, se puede asignar una hot key a una ventana, siempre que no se trate de una ventana hija. Cuando el usuario use esa combinación de teclas, la ventana pasa a primer plano, aunque esté minimizada.

Para asignar una hot key a una ventana se usa el mensaje WM_SETHOTKEY indicando en wParam el código de tecla virtual y modificadores de la hot key. Se puede usar el valor retornado por HKM_GETHOTKEY.

WPARAM key;
...
    key = SendDlgItemMessage(hwnd, ID_HOTKEY, HKM_GETHOTKEY, 0, 0);
    SendMessage(hwnd, WM_SETHOTKEY, (WPARAM)key, 0);

Obtener hot key de una ventana

También podemos obtener el valor de la hot key asignada actualmente a una ventana mediante el mensaje WM_GETHOTKEY, sin parámetros.

    key = SendMessage(hwnd, WM_GETHOTKEY, 0, 0);

Ejemplo 100

Nombre Fichero Fecha Tamaño Contador Descarga
Ejemplo 100 win100.zip 2021-11-14 6623 bytes 118