58 Control 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 indicando 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:
Valor | Significado |
---|---|
HOTKEYF_ALT | Tecla ALT |
HOTKEYF_CONTROL | Tecla CONTROL |
HOTKEYF_EXT | Tecla extendida |
HOTKEYF_SHIFT | Tecla 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:
Valor | Significado |
---|---|
HKCOMB_A | ALT |
HKCOMB_C | CTRL |
HKCOMB_CA | CTRL+ALT |
HKCOMB_NONE | Teclas sin modificar |
HKCOMB_S | SHIFT |
HKCOMB_SA | SHIFT+ALT |
HKCOMB_SC | SHIFT+CTRL |
HKCOMB_SCA | SHIFT+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 | 516 |