Регистрация событий мышки и клавиатуры
От: Learner  
Дата: 11.11.03 11:57
Оценка:
Всем привет.

Возникла проблема с регистрацией всех событий мышки и клавиатуры от клиента.
В начале попытался сделать это с помощью XGrabPointer & XGrabKeyboard & XSendEvent, но потом узнал, что некоторые программы отвергают сообщения, присланные от XSendEvent.

Также пытался с помощью Грабов с последующей генерацией ивентов через XTest, при этом приходится отключать граб на время посылки ивента, но в этом случае теряется каждый 2й ивент (ButtonPress ловится, а ButtonRelease пропускается и идет прямо к своей программе, минуя мою).

Ниже моя реализация 2го варианта

#include <X11/X.h>
#include <X11/Xlib.h>
#include <fstream>
#include <iostream>
#include <unistd.h>
#include <X11/extensions/XTest.h>
#include <vector>
#include <sys/times.h>

std::vector<XEvent*>* GrabEvents()
{
Display* tmp_pDisplay = XOpenDisplay(0);
if ( 0 == tmp_pDisplay ) return 0;

std::vector<XEvent*>* events=new std::vector<XEvent*>;
XEvent* tmp_pCurrentEvent=0;

int count=0;
while (count<20)
{
Window root, window;
int rootX,rootY,X,Y;
unsigned int mask;
XQueryPointer(tmp_pDisplay,RootWindow(tmp_pDisplay,0),&root,&window,
&rootX,&rootY,&X,&Y,&mask);

XGrabPointer(tmp_pDisplay,window, true,
ButtonPressMask|ButtonReleaseMask,GrabModeSync,
GrabModeAsync, None, None, CurrentTime);

if (!tmp_pCurrentEvent) events->push_back(tmp_pCurrentEvent=new XEvent);

if ( XCheckWindowEvent(tmp_pDisplay,window,
ButtonPressMask|ButtonReleaseMask,
tmp_pCurrentEvent) )
{
XUngrabPointer(tmp_pDisplay, CurrentTime);

XTestFakeMotionEvent(tmp_pDisplay,0,X,Y,CurrentTime);
XTestFakeButtonEvent(tmp_pDisplay,tmp_pCurrentEvent->xbutton.button,
!tmp_pCurrentEvent->xbutton.state,CurrentTime);

XGrabPointer(tmp_pDisplay,window, true,
ButtonPressMask|ButtonReleaseMask,GrabModeSync,
GrabModeAsync, None, None, CurrentTime);

std::cout<<std::hex<<root<<' '<<window<<' '<<std::dec<<rootX<<' '<<
rootY<<' '<<X<<' '<<Y<<'\n';

std::cout<<"Button state: "<<tmp_pCurrentEvent->xbutton.state<<'\n';

tmp_pCurrentEvent=0;

count++;
}

XAllowEvents(tmp_pDisplay,SyncPointer,CurrentTime);

}

XUngrabPointer(tmp_pDisplay, CurrentTime);
return events;
}

int main (int argc,char** argv)
{
std::vector<XEvent*>* events=GrabEvents();
std::cout<<events->size()<<" events were saved\n";
return 0;
}

Если кто поможет, буду признателен.
Удачи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.