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

[SOLUCIONADO] Key y Mouse listeners con c++ para linux

Estas en el tema de Key y Mouse listeners con c++ para linux en el foro de C/C++ en Foros del Web. Hola, Estoy trabajando desde hace tiempo en un proyecto donde se requiere obtener el conteo de clicks y de teclas presionados (en LINUX) durante la ...
  #1 (permalink)  
Antiguo 26/08/2015, 13:33
 
Fecha de Ingreso: agosto-2011
Mensajes: 73
Antigüedad: 12 años, 8 meses
Puntos: 0
Pregunta Key y Mouse listeners con c++ para linux

Hola,

Estoy trabajando desde hace tiempo en un proyecto donde se requiere obtener el conteo de clicks y de teclas presionados (en LINUX) durante la ejecución del programa. Estoy trabajando con Qt 5 y C++, he estado investigando Xinput, X11 y ncurses pero sin mucha suerte, en realidad lo q necesito es bastante sencillo, en cuando al mouse es el conteo por cada click o movimiento de la rueda intermedia del raton.

Y con el teclado es mas o menos lo mismo solo que necesito obtener por separado el conteo de teclas: Numero, letras, las 4 flechas y el resto del teclado.

Si alguien pudiera ayudarme a hacer el keylogger y un simialr para el mouse yo pudiera continaur desde alli.

NOTA: El usuario que usara la aplicación sabrá en todo momento que el programa esta tomando esta información, solo necesito contar las teclas no guardar la información que escriba el usuario. Es para una medir la actividad del usuario.
  #2 (permalink)  
Antiguo 27/08/2015, 19:10
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Key y Mouse listeners con c++ para linux

Hola:

En Qt tienes las clases que capturan eventos.
Puedes usar un objeto QEvent para capturar cualquier evento, mediante casting, o directamente usar objetos específicos para el evento que quieras capturar.

Este es un ejemplo de un widget que captura el botón izquierdo y del medio del ratón, así como el movimiento de la rueda, y añade una unidad a un contador.

Igualmente lee la tecla pulsada.

Está creado desde un widget estandar:
Código C++:
Ver original
  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3.  
  4. #include <QMouseEvent>
  5. #include <QWheelEvent>
  6. #include <QKeyEvent>
  7. #include <QDebug>
  8.  
  9. #include "ui_widget.h"
  10.  
  11. class Widget : public QWidget, private Ui::Widget
  12. {
  13.     Q_OBJECT
  14.  
  15. public:
  16.     explicit Widget(QWidget *parent = 0);
  17.     void mousePressEvent (QMouseEvent* m_evento);
  18.     void wheelEvent(QWheelEvent* w_evento);
  19.     void keyPressEvent(QKeyEvent *k_evento);
  20.  
  21.  
  22. private:
  23.     int contador;
  24. };
  25.  
  26. #endif // WIDGET_H

Código C++:
Ver original
  1. #include "widget.h"
  2.  
  3. Widget::Widget(QWidget *parent) :
  4.     QWidget(parent)
  5. {
  6.     setupUi(this);
  7.     contador=0;
  8. }
  9.  
  10. void Widget::mousePressEvent(QMouseEvent *m_evento)
  11. {
  12.     if (m_evento->buttons()==Qt::LeftButton || m_evento->buttons()==Qt::MiddleButton)
  13.     {
  14.         contador++;
  15.         qDebug()<<"Numero de clicks: "<<contador;
  16.     }
  17. }
  18.  
  19. void Widget::wheelEvent(QWheelEvent *w_evento)
  20. {
  21.     contador++;
  22.     qDebug()<<"Numero de clicks: "<<contador;
  23. }
  24.  
  25. void Widget::keyPressEvent(QKeyEvent *k_evento)
  26. {
  27.     qDebug()<<k_evento->text();
  28. }

Básicamente consiste en implementar las funciones virtuales:
Código C++:
Ver original
  1. void mousePressEvent (QMouseEvent* m_evento);
  2.     void wheelEvent(QWheelEvent* w_evento);
  3.     void keyPressEvent(QKeyEvent *k_evento);

Para dotarles de la funcionalidad que estés necesitando.

P.D. Si he dicho muchas tonterías espero que eferion o jc_moj me corrijan
__________________
Mi calculadora en Qt
  #3 (permalink)  
Antiguo 28/08/2015, 03:43
Avatar de jc_moj  
Fecha de Ingreso: septiembre-2009
Ubicación: Andalucía
Mensajes: 137
Antigüedad: 14 años, 7 meses
Puntos: 12
Respuesta: Key y Mouse listeners con c++ para linux

Hola

Cita:
Iniciado por dehm Ver Mensaje
P.D. Si he dicho muchas tonterías espero que eferion o jc_moj me corrijan


También funcionaría si se implementa en la ventana principal, pero creo que no controlaría lo que escribes un un QLineEdit o si haces click en un botón o un menú ¿no?

Un saludo
  #4 (permalink)  
Antiguo 28/08/2015, 07:04
 
Fecha de Ingreso: agosto-2011
Mensajes: 73
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Key y Mouse listeners con c++ para linux

Hola, gracias por las respuestas de ambos, pero creo q no me explique correctamente, necesito poder detectar la actividad del teclado y mouse en todo el sistema no solo en la ventana de la aplicación. Tengo entendido que esto no se puedo hacer con Qt o me equivoco ??
  #5 (permalink)  
Antiguo 28/08/2015, 09:29
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Key y Mouse listeners con c++ para linux

Cita:
Iniciado por susi141 Ver Mensaje
Hola, gracias por las respuestas de ambos, pero creo q no me explique correctamente, necesito poder detectar la actividad del teclado y mouse en todo el sistema no solo en la ventana de la aplicación. Tengo entendido que esto no se puedo hacer con Qt o me equivoco ??
Para hacer lo que pides necesitas un hook a nivel del sistema. Este código va a interactuar directamente con el sistema operativo, por lo que la solución final dependerá del sistema con el que vayas a trabajar, en tu caso Linux.

En este caso poco te puedo ayudar, salvo quizás avisarte que el programa que use el hook deberá tener permisos de root, porque mi trabajo actualmente está orientado a Windows. Posiblemente algún asiduo de Linux te pueda ayudar un poco más sobre este tema.

--------

Edito:

Lo mismo puedes empezar por mirar este enlace: https://blog.netspi.com/function-hoo...alls-in-linux/
  #6 (permalink)  
Antiguo 28/08/2015, 14:07
 
Fecha de Ingreso: agosto-2011
Mensajes: 73
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Key y Mouse listeners con c++ para linux

Sigo sin resolver el problema, revise el link que me pasaste pero no veo como eso pudiera aplicarse a lo que necesito, si me pudieras orientar un poco estoy algo cruda en este tema. Gracias.
  #7 (permalink)  
Antiguo 31/08/2015, 02:58
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Key y Mouse listeners con c++ para linux

No se cómo se hace en Linux porque, desde hace 4 años no forma parte de mi día a día en el trabajo.

Lo que tienes que hacer es instalar una serie de hooks en el sistema. Un hook es como si fuese un by-pass, es decir, le dices al sistema operativo que ántes de facilitarle cierta información a las aplicaciones te las pase a tí... como si fueses una especie de filtro.

En este caso concreto, lo que buscas es que el sistema operativo te facilite las pulsaciones de las teclas y ¿del ratón? pero no tiene por qué limitarse a eso. A modo de ejemplo, el antirivurs instala un hook para poder escanear los ficheros antes de que el explorador de carpetas los abra o, por poner otro ejemplo, un firewall instala un hook para que el tráfico de red pase por sus manos antes de llegarle a las aplicaciones.

Todo esto se consigue dialogando con el sistema operativo y, como te he comentado, no tengo actualmente tanto contacto con linux como para indicarte acerca de la interfaz del sistema operativo que te permite realizar estos pasos.

Lo siento
  #8 (permalink)  
Antiguo 31/08/2015, 12:22
 
Fecha de Ingreso: agosto-2011
Mensajes: 73
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Key y Mouse listeners con c++ para linux

Gracias entiendo mejor ahora, sin embargo creo q encontre una solución que pudiera funcionar, utilizando la libreria uiohook, lo que no se es si utilizando esta lib puedo comercializar mi app ??? Porq tiene licencia LGPL.

Última edición por susi141; 31/08/2015 a las 12:32
  #9 (permalink)  
Antiguo 01/09/2015, 02:09
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Key y Mouse listeners con c++ para linux

Deberías dedicar tiempo a leerte las implicaciones de usar una librería sujeta a una licencia dada. Sobretodo si pretendes sacar beneficio económico con el software resultante.

En tu caso, si enlazas la librería de forma dinámica sí que podrías comerciar tu software sin problemas... pero si intentas enlazar de forma estática la librería te puedes acabar metiendo en problemas. Pero OJO, esto también depende de la versión concreta de la licencia, así que toca leerte las restricciones para la licencia en cuestión.
  #10 (permalink)  
Antiguo 01/09/2015, 09:08
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Key y Mouse listeners con c++ para linux

Yo diría que puedes comercializar la aplicación, pero has de liberar el código junto con el ejecutable.

Ya si enlazas de forma dinámica con esa librería pues ni idea, pero lo que dice eferion tiene sentido.
__________________
Mi calculadora en Qt
  #11 (permalink)  
Antiguo 01/09/2015, 09:35
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Key y Mouse listeners con c++ para linux

Cita:
Iniciado por dehm Ver Mensaje
Yo diría que puedes comercializar la aplicación, pero has de liberar el código junto con el ejecutable.

Ya si enlazas de forma dinámica con esa librería pues ni idea, pero lo que dice eferion tiene sentido.
Si la licencia fuese GPL te podría asegurar que la única forma que tienes de usar la librería de forma legal es convirtiendo tu producto a open source y publicarlo con licencia GPL.

LGPL viene a ser una licencia más relajada que la GPL original. Esta licencia nació para licenciar todas aquellas librerías que tienen un homólogo en versión código privativo.

Esta licencia distingue entre enlazado estático y enlazado dinámico:

  • Cuando el enlazado es estático el código fuente de la librería se integra en el código de la aplicación, luego la única solución es licenciar el producto final bajo licencia LGPL o GPL.
  • En el caso del enlazado dinámico, el código de la librería queda desligado del código de la aplicación. La aplicación únicamente hace uso de la librería, por lo que, en teoría, tiene libertad a la hora de elegir la licencia. Si en vez de LGPL fuese GPL no tendrías esta opción, GPL sirve para forzar la reforzar la creación de código open source.
Por eso os digo... leeros muy bien las licencias de las librerías que tengáis pensado usar... no vaya a ser que luego vengan los sustos.


Un saludo
  #12 (permalink)  
Antiguo 01/09/2015, 10:35
 
Fecha de Ingreso: agosto-2011
Mensajes: 73
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Key y Mouse listeners con c++ para linux

Muchas gracias a todos por sus respuestas, muy probablemente utilizare esta libreria.

Etiquetas: c++, key, linux, listeners, mouse
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 06:22.