Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Cuantas HOTKEY se pueden registrar simultaneamente? (https://www.clubdelphi.com/foros/showthread.php?t=30486)

JuanErasmo 07-04-2006 15:50:49

Cuantas HOTKEY se pueden registrar simultaneamente?
 
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 utilizan
Cita:

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");
}
}
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

Como puede hacerse entonces?
 
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:
Cita:

Empezado por Api de delphi
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 Neftali...
 
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:
Cita:

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

Gracias Lepe..
 
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

se me olvidaba...
 
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:

Código Delphi [-]

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.

Código:

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

Funciona pero...
 
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

Cita:

"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??


La franja horaria es GMT +2. Ahora son las 04:17:26.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi