PDA

Ver la Versión Completa : Cuantas HOTKEY se pueden registrar simultaneamente?


JuanErasmo
07-04-2006, 15:50:49
Buenos Dias amigos....
Estoy intentando hacer un programa para que registre todas las teclas que se digitan en un PC en las diferentes aplicaciones ( Word, Excel, Internet ....todas), y vi en un hilo que utilizanvoid __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->OnMessage = AppMessage;
//
// 79 es el código ASCII de la letra "O". No he conseguido encontrar la función
// correspondiente a "Ord" (en Delphi) aquí en C++ Builder. He probado con
// Integer("O") y con Cardinal("0"), pero, no funciona, así que al cabo he optado
// por pasar como tercer parámetro de "RegisterHotKey" el número 79, que ya sabes
// lo que quiere significar. ;)
//
RegisterHotKey(Application->Handle, GlobalAddAtomA("MiHotKey"), MOD_CONTROL, 79);
RegisterHotKey(Application->Handle, GlobalAddAtomA("MiHotKey2"), 0 , 79);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
{
if (Msg.message == WM_HOTKEY)
{
if ( (LOWORD(Msg.lParam) == MOD_CONTROL) && (HIWORD(Msg.lParam) == 79) )
ShowMessage("Pulsaste las teclas CTRL + O");
}
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
UnregisterHotKey(Application->Handle, GlobalAddAtomA("MiHotKey"));
}

lo que no se, es si con registerHotKey se pueden registrar todas las teclas del teclado para que registre los eventos....
Es posible con esta funcion? o debo buscar otra?
Gracias por su respuesta!

Neftali [Germán.Estévez]
07-04-2006, 16:04:51
Creo que te estás confundiendo.
Lo que tu pretendes (por lo que he entendido) es guardar constancia de todo lo que se teclea y el código (API) a la que heces referencia lo que hace es "Registrar una combinación de teclas", lo que quiere decir que esa combinación es accesible desde cualquier programa que se ejecute en ese sistema de forma global.

JuanErasmo
07-04-2006, 16:19:18
Hola Neftali!
Como puedo guardar constancia de todo lo que se teclea entonces?
teniendo mi aplicación en background?
Es posible?
Gracias

Lepe
07-04-2006, 16:29:23
RegisterHotKey está pensado para combinaciones de teclas... pero nada te impide realizarlo con la tecla A, B, C, D.

Es simplemente un gancho a la tecla/combinación que sea. Y sí, mientras tu aplicación esté funcionando recibirá la tecla pulsada por el usuario, ya esté en Word, Excel, Bloc de notas, etc. De hecho la recibe antes que las demás aplicaciones, por tanto, tú en tu keylogger deberás permitir el paso de la tecla hacia las demás aplicaciones.

Se permiten 49.151 teclas registradas, ya que segun la ayuda el rango es de:

range 0x0000 through 0xBFFF. A shared dynamic-link library (DLL) must specify a value in the range 0xC000 through 0xFFFF

RegisterHotKey fails if the keystrokes specified for the hot key have already been registered by another hot key.


Aunque normalmente no hay otras aplicaciones con ganchos de teclado, puede que alguno en particular si esté pillado, y entonces no recibirás la notificación. Consecuentemente no tienes 49.000 ganchos sino algunos menos.

Yo uso ganchos de este tipo para:
Apagar (ctrl+F11),
reiniciar(ctrl+ F10),
forzar reiniciado(ctrl+alt+F10,
forzar apagar(ctrl+alt+F11),
Apagar los monitores(F4),
Abrir mi buscador de programas(F10) :D.

Hasta ahora no me ha dado problemas.

He hecho la prueba con la tecla A, y tambien funciona.

Saludos

JuanErasmo
07-04-2006, 16:51:03
Gracias otra vez...pero se pueden registrar varias hotkeys?
es decir que mi programa responda a A, B,C, D,E,F todas las que se tecleen...
En el ejemplo anterior solo responde a Ctrl+O, y he intentado registrar por ejemplo la O tambien y no funciona....es decir que responda a cada tecla.....
porque no funciona?
lo hago asi:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->OnMessage = AppMessage;
//
// 79 es el código ASCII de la letra "O". No he conseguido encontrar la función
// correspondiente a "Ord" (en Delphi) aquí en C++ Builder. He probado con
// Integer("O") y con Cardinal("0"), pero, no funciona, así que al cabo he optado
// por pasar como tercer parámetro de "RegisterHotKey" el número 79, que ya sabes
// lo que quiere significar. ;)
//
RegisterHotKey(Application->Handle, GlobalAddAtomA("MiHotKey"), MOD_CONTROL, 79);
RegisterHotKey(Application->Handle, GlobalAddAtomA("MiHotKey2"), 0 , 79);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
{
if (Msg.message == WM_HOTKEY)
{
if ( (LOWORD(Msg.lParam) == MOD_CONTROL) && (HIWORD(Msg.lParam) == 79) )
ShowMessage("Pulsaste las teclas CTRL + O");
}
else if ((HIWORD(Msg.lParam) == 79) )
ShowMessage("pulsaste O");
}
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
UnregisterHotKey(Application->Handle, GlobalAddAtomA("MiHotKey"));
}

Como ves, registro Ctrl+O y tambien O solo, pero en el parámetro MODE = MOD_CONTROL.....no se como decirle que es una tecla normal sin CTRL ni SHIFT es sola.....no se como decirle esto...puede ser que por esta razon no funcione....
Gracias si puedes ayedarme...

JuanErasmo
07-04-2006, 17:39:21
Pero como se puede decir que la tecla es normal?
que no tiene no CTRL ni SHIFT ni nada?
Gracias

JuanErasmo
07-04-2006, 17:41:28
Donde puedo conseguir los números equivalentes a la tecla?
por ejemplo la O es 79, pero las otras cuales son?
Es el codigo ASCII?
Gracias!

Lepe
07-04-2006, 17:46:18
Le daré las gracias a Neftali de tu parte.... :D

Lo que recibes por msg.WParam es el GlobalAtom que has definido, no la tecla ni los modificadores, (al menos en delphi es así, garantizado). Yo haciendo caso omiso a la ayuda de delphi hago lo siguiente:



procedure registrarTeclas:
begin
registerhotkey(self.Handle, 0, 0, 70);
registerhotkey(self.Handle, 1, 0, 71);
registerhotkey(self.Handle, 2, 0, 72);

// del 70 al 72 es el código ascii que quiero capturar
// el valor 0, 1, 2 son los globalAtom que tu usas, en definitiva:
// números que no se repitan,
end;

procedure Unregister;
begin
unregisterhotkey(self.Handle, 0);
unregisterhotkey(self.Handle, 1);
unregisterhotkey(self.Handle, 2);
// quito el registro a las 3 teclas.
end;

procedure TForm1.WndProc(var Msg: TMessage);
if msg.msg = wm_hotkey then
begin
case msg.WParam of
0: // se recibe el codigo 70
1: // se recibe el codigo 71
2: // se recibe el codigo 72
end; // case
inherited WndProc(Msg); // para que lo reciban las demás aplicaciones.
end;


Digo que hago caso omiso a la ayuda, porque allí dice que use GlobalAtom, obviamente si hay otras aplicaciones que estan usando ganchos, podría ser que 0, 1 y 2 estuviesen ya cogidos y no me deje registrar la tecla.

Obviamente tu código está mejor, porque usas GlobalAtom que te garantiza un número que no existe en el sistema, pero claro, tienes que guardar el GlobalAtom para poder relacionarlo despues en el procedure AppMessage.

Yo probé pasándoles números enteros, 0, 1, 2 y funcionó. Eso sí deben ser números que no se repitan, ya no recuerdo si deben ser consecutivos o no....

Para el tema de modificadores ctrl, alt y shift, va así:
shift = 4
ctrl = 2
Alt = 1

De tal forma que si quieres "ctrl + alt" pues suma sus valores y pones un 3.
Esto equivale a MOD_CONTROL + MOD_ALT
Si no quieres parámetros pon un cero.

Es raro que te funcione con Ctrl + O, porque segun explicas... no veo que esté bien implementado, hazlo de la forma que te comento y nos cuentass ;)

Saludos

Lepe
07-04-2006, 17:48:32
Si son los códigos ascii, con el mapa de caracteres de windows te da el número en hexadecimal, usas la calculadora de windows y lo pasas a decimal.

Saludos

Lepe
07-04-2006, 18:18:06
Perdón, no son codigo ascii sino codigos virtuales, en la ayuda de C++ escribe "virtual key codes" y verás un listado.

Es casi lo mismo... pero hay códigos especiales.

Saludos

seoane
07-04-2006, 19:07:11
La listita completa directamente de microsoft :D Especilamente utiles las teclas de mute, volumen ... etc que no vienen en otros listados y que si estan incluidos en este.


VK_LBUTTON 01 Left mouse button
VK_RBUTTON 02 Right mouse button
VK_CANCEL 03 Control-break processing
VK_MBUTTON 04 Middle mouse button (three-button mouse)
VK_XBUTTON1 05 Windows 2000/XP: X1 mouse button
VK_XBUTTON2 06 Windows 2000/XP: X2 mouse button
- 07 Undefined
VK_BACK 08 BACKSPACE key
VK_TAB 09 TAB key
- 0A-0B Reserved
VK_CLEAR 0C CLEAR key
VK_RETURN 0D ENTER key
- 0E-0F Undefined
VK_SHIFT 10 SHIFT key
VK_CONTROL 11 CTRL key
VK_MENU 12 ALT key
VK_PAUSE 13 PAUSE key
VK_CAPITAL 14 CAPS LOCK key
VK_KANA 15 IME Kana mode
VK_HANGUEL 15 IME Hanguel mode (maintained for compatibility; use VK_HANGUL)
VK_HANGUL 15 IME Hangul mode
- 16 Undefined
VK_JUNJA 17 IME Junja mode
VK_FINAL 18 IME final mode
VK_HANJA 19 IME Hanja mode
VK_KANJI 19 IME Kanji mode
- 1A Undefined
VK_ESCAPE 1B ESC key
VK_CONVERT 1C IME convert (Reserved for Kanji systems)
VK_NONCONVERT 1D IME nonconvert (Reserved for Kanji systems)
VK_ACCEPT 1E IME accept (Reserved for Kanji systems)
VK_MODECHANGE 1F IME mode change request (Reserved for Kanji systems)
VK_SPACE 20 SPACEBAR
VK_PRIOR 21 PAGE UP key
VK_NEXT 22 PAGE DOWN key
VK_END 23 END key
VK_HOME 24 HOME key
VK_LEFT 25 LEFT ARROW key
VK_UP 26 UP ARROW key
VK_RIGHT 27 RIGHT ARROW key
VK_DOWN 28 DOWN ARROW key
VK_SELECT 29 SELECT key
VK_PRINT 2A PRINT key
VK_EXECUTE 2B EXECUTE key
VK_SNAPSHOT 2C PRINT SCREEN key for Windows 3.0 and later
VK_INSERT 2D INS key
VK_DELETE 2E DEL key
VK_HELP 2F HELP key
VK_0 30 0 key
VK_1 31 1 key
VK_2 32 2 key
VK_3 33 3 key
VK_4 34 4 key
VK_5 35 5 key
VK_6 36 6 key
VK_7 37 7 key
VK_8 38 8 key
VK_9 39 9 key
- 3A-40 Undefined
VK_A 41 A key
VK_B 42 B key
VK_C 43 C key
VK_D 44 D key
VK_E 45 E key
VK_F 46 F key
VK_G 47 G key
VK_H 48 H key
VK_I 49 I key
VK_J 4A J key
VK_K 4B K key
VK_L 4C L key
VK_M 4D M key
VK_N 4E N key
VK_O 4F O key
VK_P 50 P key
VK_Q 51 Q key
VK_R 52 R key
VK_S 53 S key
VK_T 54 T key
VK_U 55 U key
VK_V 56 V key
VK_W 57 W key
VK_X 58 X key
VK_Y 59 Y key
VK_Z 5A Z key
VK_LWIN 5B Left Windows key (Microsoft Natural Keyboard)
VK_RWIN 5C Right Windows key (Microsoft Natural Keyboard)
VK_APPS 5D Applications key (Microsoft Natural Keyboard)
- 5E Reserved
VK_SLEEP 5F Computer Sleep key
VK_NUMPAD0 60 Numeric keypad 0 key
VK_NUMPAD1 61 Numeric keypad 1 key
VK_NUMPAD2 62 Numeric keypad 2 key
VK_NUMPAD3 63 Numeric keypad 3 key
VK_NUMPAD4 64 Numeric keypad 4 key
VK_NUMPAD5 65 Numeric keypad 5 key
VK_NUMPAD6 66 Numeric keypad 6 key
VK_NUMPAD7 67 Numeric keypad 7 key
VK_NUMPAD8 68 Numeric keypad 8 key
VK_NUMPAD9 69 Numeric keypad 9 key
VK_MULTIPLY 6A Multiply key
VK_ADD 6B Add key
VK_SEPARATOR 6C Separator key
VK_SUBTRACT 6D Subtract key
VK_DECIMAL 6E Decimal key
VK_DIVIDE 6F Divide key
VK_F1 70 F1 key
VK_F2 71 F2 key
VK_F3 72 F3 key
VK_F4 73 F4 key
VK_F5 74 F5 key
VK_F6 75 F6 key
VK_F7 76 F7 key
VK_F8 77 F8 key
VK_F9 78 F9 key
VK_F10 79 F10 key
VK_F11 7A F11 key
VK_F12 7B F12 key
VK_F13 7C F13 key
VK_F14 7D F14 key
VK_F15 7E F15 key
VK_F16 7F F16 key
VK_F17 80H F17 key
VK_F18 81H F18 key
VK_F19 82H F19 key
VK_F20 83H F20 key
VK_F21 84H F21 key
VK_F22 85H F22 key
VK_F23 86H F23 key
VK_F24 87H F24 key
- 88-8F Unassigned
VK_NUMLOCK 90 NUM LOCK key
VK_SCROLL 91 SCROLL LOCK key
VK_OEM_NEC_EQUAL 92 NEC PC-9800 kbd definitions: '=' key on numpad
VK_OEM_FJ_JISHO 92 Fujitsu/OASYS kbd definitions: 'Dictionary' key
VK_OEM_FJ_MASSHOU 93 Fujitsu/OASYS kbd definitions: 'Unregister word' key
VK_OEM_FJ_TOUROKU 94 Fujitsu/OASYS kbd definitions: 'Register word' key
VK_OEM_FJ_LOYA 95 Fujitsu/OASYS kbd definitions: 'Left OYAYUBI' key
VK_OEM_FJ_ROYA 96 Fujitsu/OASYS kbd definitions: 'Right OYAYUBI' key
- 97-9F Unassigned
VK_LSHIFT A0 Left SHIFT key
VK_RSHIFT A1 Right SHIFT key
VK_LCONTROL A2 Left CONTROL key
VK_RCONTROL A3 Right CONTROL key
VK_LMENU A4 Left MENU key
VK_RMENU A5 Right MENU key
VK_BROWSER_BACK A6 Windows 2000/XP: Browser Back key
VK_BROWSER_FORWARD A7 Windows 2000/XP: Browser Forward key
VK_BROWSER_REFRESH A8 Windows 2000/XP: Browser Refresh key
VK_BROWSER_STOP A9 Windows 2000/XP: Browser Stop key
VK_BROWSER_SEARCH AA Windows 2000/XP: Browser Search key
VK_BROWSER_FAVORITES AB Windows 2000/XP: Browser Favorites key
VK_BROWSER_HOME AC Windows 2000/XP: Browser Start and Home key
VK_VOLUME_MUTE AD Windows 2000/XP: Volume Mute key
VK_VOLUME_DOWN AE Windows 2000/XP: Volume Down key
VK_VOLUME_UP AF Windows 2000/XP: Volume Up key
VK_MEDIA_NEXT_TRACK B0 Windows 2000/XP: Next Track key
VK_MEDIA_PREV_TRACK B1 Windows 2000/XP: Previous Track key
VK_MEDIA_STOP B2 Windows 2000/XP: Stop Media key
VK_MEDIA_PLAY_PAUSE B3 Windows 2000/XP: Play/Pause Media key
VK_LAUNCH_MAIL B4 Windows 2000/XP: Start Mail key
VK_LAUNCH_MEDIA_SELECT B5 Windows 2000/XP: Select Media key
VK_LAUNCH_APP1 B6 Windows 2000/XP: Start Application 1 key
VK_LAUNCH_APP2 B7 Windows 2000/XP: Start Application 2 key
- B8-B9 Reserved
VK_OEM_1 BA Windows 2000/XP: For the US standard keyboard, the ';:' key
VK_OEM_PLUS BB Windows 2000/XP: For any country/region, the '+' key
VK_OEM_COMMA BC Windows 2000/XP: For any country/region, the ',' key
VK_OEM_MINUS BD Windows 2000/XP: For any country/region, the '-' key
VK_OEM_PERIOD BE Windows 2000/XP: For any country/region, the '.' key
VK_OEM_2 BF Windows 2000/XP: For the US standard keyboard, the '/?' key
VK_OEM_3 C0 Windows 2000/XP: For the US standard keyboard, the '`~' key
- C1-D7 Reserved
- D8-DA Unassigned
VK_OEM_4 DB Windows 2000/XP: For the US standard keyboard, the '[{' key
VK_OEM_5 DC Windows 2000/XP: For the US standard keyboard, the '\|' key
VK_OEM_6 DD Windows 2000/XP: For the US standard keyboard, the ']}' key
VK_OEM_7 DE Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key
VK_OEM_8 DF
- E0 Reserved
E1 OEM specific
VK_OEM_102 E2 Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard
- E3-E4 OEM specific
VK_PROCESSKEY E5 Windows 95/98, Windows NT 4.0, Windows 2000/XP: IME PROCESS key
- E6 OEM specific
VK_PACKET E7 Windows 2000/XP: Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in KEYBDINPUT , SendInput , WM_KEYDOWN , and WM_KEYUP
- E8 Unassigned
VK_OEM_RESET E9 Only used by Nokia.
VK_OEM_JUMP EA Only used by Nokia.
VK_OEM_PA1 EB Only used by Nokia.
VK_OEM_PA2 EC Only used by Nokia.
VK_OEM_PA3 ED Only used by Nokia.
VK_OEM_WSCTRL EE Only used by Nokia.
VK_OEM_CUSEL EF Only used by Nokia.
VK_OEM_ATTN F0 Only used by Nokia.
VK_OEM_FINNISH F1 Only used by Nokia.
VK_OEM_COPY F2 Only used by Nokia.
VK_OEM_AUTO F3 Only used by Nokia.
VK_OEM_ENLW F4 Only used by Nokia.
VK_OEM_BACKTAB F5 Only used by Nokia.
VK_ATTN F6 Attn key
VK_CRSEL F7 CrSel key
VK_EXSEL F8 ExSel key
VK_EREOF F9 Erase EOF key
VK_PLAY FA Play key
VK_ZOOM FB Zoom key
VK_NONAME FC Reserved for future use.
VK_PA1 FD PA1 key
VK_OEM_CLEAR FE Clear key
FF Multimedia keys. See ScanCode keys.


Parece que al usar copiar y pegar queda un poco descolocado, lo siento, pero parace que se entiende bien.

JuanErasmo
07-04-2006, 19:22:09
Hola!
Otra vez soy yo...
funciona pero no me deja escribir en la otra aplicacion.....
es decir, si escribo barra espaciadora en word...no me la deja escribir... me bloquea la tecla....
como evito eso??
Gracias!

JuanErasmo
07-04-2006, 19:27:51
"De hecho la recibe antes que las demás aplicaciones, por tanto, tú en tu keylogger deberás permitir el paso de la tecla hacia las demás aplicaciones."
Como puedo permitir que pase la tecla??
es que se queda bloqueada y no pasa a la aplicacion.....
como se puede hacer esto??