qt — блокировка клавиатуры C ++ и XGrabKeyboard

Я пытаюсь написать небольшую программу на C ++, которая должна определять, нажимает ли пользователь любую клавишу на клавиатуре.
или заставить мышь двигаться. Эту программу мне нужно запустить на Ubuntu или Centos.
Вот почему для обнаружения нажатия клавиш я использую библиотеку X11.

Вот код, который я погуглил:

    #include <stdio.h>
#include <cstring>
#include <iostream>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

using namespace std;

int main(void)
{
Display * dpy = XOpenDisplay(0x0);
XEvent ev;

if(!dpy) return 1;

Time t = CurrentTime;
XGrabKeyboard(dpy, DefaultRootWindow(dpy), false,
GrabModeAsync, GrabModeAsync,t);

for(;;)
{
//XGrabKeyboard(dpy, DefaultRootWindow(dpy), false,
//                   GrabModeAsync, GrabModeAsync,t);
XNextEvent(dpy, &ev);
if(ev.type == KeyPress)
cout << "Key pressed" << endl;
// XGrabKeyboard(dpy, DefaultRootWindow(dpy), false,
//                      GrabModeAsync, GrabModeAsync,t);

}
}

Это работает хорошо, но не правильно для меня.
Он блокирует клавиатуру для ввода во всех окнах, кроме собственной программы (раскомментирование первой и последней строк в цикле дало мне тот же результат).

Может кто-нибудь знает, как я могу это исправить или какую библиотеку я могу использовать вместо этого.

Благодарю.

1

Решение

XSendEvent () помогает мне. Увидеть http://tronche.com/gui/x/xlib/event-handling/XSendEvent.html

 switch(ev.type)
{
case KeyPress:
XSendEvent(display,InputFocus,False,KeyPressMask,&ev);
break;
case KeyRelease:
XSendEvent(display,InputFocus,True,KeyReleaseMask,&ev);
break;
case ButtonPress:
XSendEvent(display,PointerWindow,True,ButtonPressMask,&ev);
break;
case ButtonRelease:
XSendEvent(display,PointerWindow,True,ButtonPressMask,&ev);
break;
default:

break;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]