Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Como obtener el conteo de teclas y click presionados ??

Estas en el tema de Como obtener el conteo de teclas y click presionados ?? en el foro de C/C++ en Foros del Web. Hola, Necesito saber si existe alguna libreria o alguna forma de detectar cuando una tecla o un click es presionado, no solo en la ventana ...
  #1 (permalink)  
Antiguo 06/05/2015, 05:12
 
Fecha de Ingreso: agosto-2011
Mensajes: 73
Antigüedad: 12 años, 8 meses
Puntos: 0
Pregunta Como obtener el conteo de teclas y click presionados ??

Hola,

Necesito saber si existe alguna libreria o alguna forma de detectar cuando una tecla o un click es presionado, no solo en la ventana de la aplicacion si no en todo el sistema.

Estoy trabajando con qt y c++.

Si alguien puediera orientarme un poco en este aspecto, lo agradeceria.
  #2 (permalink)  
Antiguo 06/05/2015, 07:15
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 1 mes
Puntos: 3
Respuesta: Como obtener el conteo de teclas y click presionados ??

Necesitas crear un keyloger de teclado. Busca informacion ya que es muy sencillo y te permite detectar cualquier pulsacion de cualquier tecla del teclado incluidas las especiales.
Si no das con la tecla avisa y te busco un ejemplo que tengo por ahi.

EDITO: Encontré el proyecto que tengo de ejemplo aunque es para Borland C++Builder pero es practicamente igual, solo cambia los eventos de los botones y poco mas ya que usa APIs de Windows:

Código C++:
Ver original
  1. //---------------------------------------------------------------------------
  2.  
  3. #include <vcl.h>
  4. #pragma hdrstop
  5.  
  6. #include "Main.h"
  7. //---------------------------------------------------------------------------
  8. #pragma package(smart_init)
  9. #pragma resource "*.dfm"
  10.  
  11. #define OK -32767 //Necesario para el keylogger
  12.  
  13. LRESULT WINAPI KeyboardEvent(int nCode, WPARAM wParam, LPARAM lParam);
  14.  
  15. TForm1 *Form1;
  16. HHOOK  hKeyboardHook;
  17. //---------------------------------------------------------------------------
  18.  
  19. __fastcall TForm1::TForm1(TComponent* Owner)
  20.    : TForm(Owner)
  21. {
  22. }
  23. //---------------------------------------------------------------------------
  24.  
  25. void __fastcall TForm1::ButtonColocarHookClick(TObject *Sender)
  26. {
  27.    hKeyboardHook  = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyboardEvent, GetModuleHandle(NULL), 0);
  28.    ButtonColocarHook->Enabled = false;
  29.    ButtonQuitarHook->Enabled = true;
  30. }
  31. //---------------------------------------------------------------------------
  32.  
  33. void __fastcall TForm1::ButtonQuitarHookClick(TObject *Sender)
  34. {
  35.    UnhookWindowsHookEx(hKeyboardHook);
  36.    ButtonColocarHook->Enabled = true;
  37.    ButtonQuitarHook->Enabled = false;
  38. }
  39. //---------------------------------------------------------------------------
  40.  
  41. LRESULT WINAPI KeyboardEvent(int nCode, WPARAM wParam, LPARAM lParam)
  42. {
  43.    if( (nCode == HC_ACTION) && ((wParam == WM_SYSKEYDOWN) || (wParam == WM_KEYDOWN)) ){
  44.       if(GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_SHIFT))
  45.       {
  46.          switch(*(PDWORD)lParam)
  47.          {
  48.             case 'C': //Ctrl+Shift+C
  49.                MessageBox(NULL,"Has pulsado Ctrl+Shift+C.","Atención", MB_OK | MB_ICONINFORMATION);
  50.                break;
  51.  
  52.             case 'V': //Ctrl+Shift+V
  53.                MessageBox(NULL,"Has pulsado Ctrl+Shift+V.","Atención", MB_OK | MB_ICONINFORMATION);
  54.                break;
  55.          }
  56.       }else if(GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_MENU))
  57.       {
  58.          switch(*(PDWORD)lParam)
  59.          {
  60.             case 'C': //Ctrl+Alt+C
  61.                MessageBox(NULL,"Has pulsado Ctrl+Alt+C.","Atención", MB_OK | MB_ICONINFORMATION);
  62.                break;
  63.  
  64.             case 'V': //Ctrl+Alt+V
  65.                MessageBox(NULL,"Has pulsado Ctrl+Alt+V.","Atención", MB_OK | MB_ICONINFORMATION);
  66.                break;
  67.          }
  68.       }else if(GetAsyncKeyState(VK_CONTROL))
  69.       {
  70.          switch(*(PDWORD)lParam)
  71.          {
  72.             case 'C': //Ctrl+C
  73.                MessageBox(NULL,"Has intentado copiar al portapapeles usando Ctrl+C.","Atención", MB_OK | MB_ICONINFORMATION);
  74.                break;
  75.  
  76.             case 'V': //Ctrl+V
  77.                MessageBox(NULL,"Has intentado pegar desde el portapapeles usando Ctrl+V.","Atención", MB_OK | MB_ICONINFORMATION);
  78.                break;
  79.          }
  80.       }else if(GetAsyncKeyState(VK_MENU))
  81.       {
  82.          switch(*(PDWORD)lParam)
  83.          {
  84.             case 'C': //Alt+C
  85.                MessageBox(NULL,"Has pulsado Alt+C.","Atención", MB_OK | MB_ICONINFORMATION);
  86.                break;
  87.  
  88.             case 'V': //Alt+V
  89.                MessageBox(NULL,"Has pulsado Alt+V.","Atención", MB_OK | MB_ICONINFORMATION);
  90.                break;
  91.          }
  92.       }else if(GetAsyncKeyState(VK_SHIFT)){
  93.          switch(*(PDWORD)lParam)
  94.          {
  95.             case 'C': //Shift+C
  96.                MessageBox(NULL,"Has pulsado Shift+C.","Atención", MB_OK | MB_ICONINFORMATION);
  97.                break;
  98.  
  99.             case 'V': //Shift+V
  100.                MessageBox(NULL,"Has pulsado Shift+V.","Atención", MB_OK | MB_ICONINFORMATION);
  101.                break;
  102.          }
  103.       }else{
  104.          switch(*(PDWORD)lParam)
  105.          {
  106.             case 'C': //C
  107.                MessageBox(NULL,"Has pulsado C.","Atención", MB_OK | MB_ICONINFORMATION);
  108.                break;
  109.  
  110.             case 'V': //V
  111.                MessageBox(NULL,"Has pulsado V.","Atención", MB_OK | MB_ICONINFORMATION);
  112.                break;
  113.          }
  114.       }
  115.    }
  116.    return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
  117. }
  118. //---------------------------------------------------------------------------
  119.  
  120. void __fastcall TForm1::FormCreate(TObject *Sender)
  121. {
  122.    hKeyboardHook  = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyboardEvent, GetModuleHandle(NULL), 0);
  123.    ButtonColocarHook->Enabled = false;
  124.    ButtonQuitarHook->Enabled = true;
  125. }
  126. //---------------------------------------------------------------------------
  127.  
  128. void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
  129. {
  130.    UnhookWindowsHookEx(hKeyboardHook);
  131.    ButtonColocarHook->Enabled = true;
  132.    ButtonQuitarHook->Enabled = false;
  133. }
  134. //---------------------------------------------------------------------------

Eso si, yo lo hice para controlar solo las teclas C y V con todas sus combinaciones, si quieres controlar todo todo mejor create una funcion la cual obtenga la tecla pulsada y llamas desde cada situacion para hacer el codigo mas pequeño porque si no vas ha tener un codigo espaguetis de la ostia jajaja.

Última edición por aguml; 06/05/2015 a las 07:45
  #3 (permalink)  
Antiguo 06/05/2015, 09:05
 
Fecha de Ingreso: agosto-2011
Mensajes: 73
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Como obtener el conteo de teclas y click presionados ??

Perfecto lo voy a probar, pero funciona solo en windows ?? Porque necesito que una solucion multiplataforma o una forma de hacerlo para cada plataforma, principalmente Windows y linux por ahora.

Y con respecto al mouse?? Existe alguna libreria en c++ o qt, como JNativeHook en java??
  #4 (permalink)  
Antiguo 06/05/2015, 10:52
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Como obtener el conteo de teclas y click presionados ??

Bueno, en la aplicación puedes capturar los eventos de teclado y ratón.
http://doc.qt.io/qt-4.8/qkeyevent.html
http://doc.qt.io/qt-4.8/qmouseevent.html

Pero fuera de ella ni idea.
__________________
Mi calculadora en Qt
  #5 (permalink)  
Antiguo 06/05/2015, 11:38
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Como obtener el conteo de teclas y click presionados ??

puedes usar OpenGL/GLUT
para winapi: http://winapi.conclase.net/curso/?wi...tAsyncKeyState

opengl poner en google: "Control de eventos opengl" incluya teclado o ratón o ambas obtendrás mucho material.
  #6 (permalink)  
Antiguo 06/05/2015, 12:44
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 1 mes
Puntos: 3
Respuesta: Como obtener el conteo de teclas y click presionados ??

El problema es que, como su nombre indica, WinApi es para Windows. Lo que te he puesto vale para todos los windows o al menos desde XP hasta 8.
Para Linux tendrias que ver como crearlo en linux y luego con codigo detectar si corre en windows o linux y ejecutar uno u otro codigo para el keyloger.
La verdad es que no se que pretendes hacer pero tiene muy mala pinta jajaja.
  #7 (permalink)  
Antiguo 06/05/2015, 14:52
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Como obtener el conteo de teclas y click presionados ??

winapi sí, pero opengl sirve para ambos.
Si es un keyloger mejor es usar las apis ya que el programa quedaría más reducido.
  #8 (permalink)  
Antiguo 06/05/2015, 23:14
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 1 mes
Puntos: 3
Respuesta: Como obtener el conteo de teclas y click presionados ??

Si amigo, no lo decía por lo que tu pusiste sino porque yo decía que usaba las apis de Windows y luego me preguntaba si era multiplataforma. Hasta donde yo se, la cosa se complica bastante en Linux y en Mac ya ni idea. Quizás sea mejor opengl como indicas.
  #9 (permalink)  
Antiguo 07/05/2015, 04:21
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Como obtener el conteo de teclas y click presionados ??

Para responder a una pregunta lo primero que hay que hacer es leerla entera y comprenderla.

El autor de la duda dice que usa Qt y que necesita algo multiplataforma, así que no tiene mucho sentido ir recomendando la API de Windows.

Además, y puesto que Qt ya es multiplataforma, tampoco tiene mucho sentido recomendar OpenGL para solventar este aspecto.

(Si....hoy estoy en modo capitán pedante)
__________________
Mi calculadora en Qt
  #10 (permalink)  
Antiguo 07/05/2015, 06:11
 
Fecha de Ingreso: agosto-2011
Mensajes: 73
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Como obtener el conteo de teclas y click presionados ??

Muchas gracias a todos por sus cometarios, pero si efectivamente necesito una solucion que pueda implementar usando Qt y C++, pero que funcione en cualquier sistema operativo.

Y requiero el conteo de teclas y clicks presionados en todo el sistema no solo en Qt, porq necesito especificar en que programa o programas y cual es el titulo de la ventana o ventanas.
  #11 (permalink)  
Antiguo 07/05/2015, 07:32
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Como obtener el conteo de teclas y click presionados ??

Buscar eventos de teclado em Qt... Mira que soys complicados XD.
QKeyEvent Class: http://doc.qt.io/qt-5/qkeyevent.html

+
QMouseEvent Class: http://doc.qt.io/qt-5/qmouseevent.html
http://doc.qt.io/qt-5/qtquick-input-mouseevents.html
http://doc.qt.io/qt-5/qmouseevent-members.html

leer teclas se llama evento en todos los lados. Se trata de poner algo que espere la pulsacion de teclas constantemente.

Desconozco si hay algo mejor.
  #12 (permalink)  
Antiguo 07/05/2015, 10:22
 
Fecha de Ingreso: agosto-2011
Mensajes: 73
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Como obtener el conteo de teclas y click presionados ??

tengo entendido que las clases Event the Qt solo registran eventos en las ventanas de la aplicacion y yo necesito registrar en todoel sistema.

A menos que me equivoque, si es asi que alguien me corrija.
  #13 (permalink)  
Antiguo 07/05/2015, 11:05
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 1 mes
Puntos: 3
Respuesta: Como obtener el conteo de teclas y click presionados ??

Para hacer lo que quieres necesitas hacer hooks a las funciones encargadas de eso. Que yo sepa qt no es adecuado para eso. Deberías de usar c++ puro y duro y controtar si se ejecuta en windows o Linux para hacer los hooks oportunos.
En Linux nunca hice nada así y no puedo ayudarte. En Windows tienes que hacerlo usando las winapis ¿para que volver a inventar la rueda?
Lo que quieres no es nada sencillo que se resuelva con tres líneas. Hay keylogers de código abierto para Linux así que podrías ver sus códigos y ver como lo hacen.
Supongo que la mayoría estarán en python y si fuese así eso si que seria multiplataforma je je je.
  #14 (permalink)  
Antiguo 07/05/2015, 12:57
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Como obtener el conteo de teclas y click presionados ??

hooks +1
Creo también que la mejor opción es la api del sistema. El programa será más ligero.
  #15 (permalink)  
Antiguo 15/05/2015, 05:40
 
Fecha de Ingreso: agosto-2011
Mensajes: 73
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Como obtener el conteo de teclas y click presionados ??

Muchas a gracias por todos por sus respuestas.

probare lo de los hooks, pero en ese caso tendria que chequear que sistema tiene la computadora ?? Y realizar un codigo diferentes para Windows, linux y mac ??

Etiquetas: conteo, teclas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:09.