我正在尝试编写小型C ++程序,该程序应检测用户是否按下键盘上的任意键 或让鼠标移动。我需要的程序在Ubuntu或Centos上运行。 这就是按键检测我使用X11库的原因。
这是我用Google搜索的代码:
#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);
}
}
它运作良好,但对我来说不合适。 它锁定所有窗口中的输入键盘,除了它自己的程序(在循环中取消注释第一行和最后一行给出了相同的结果)。
也许有人知道如何修复它或者我可以使用哪个库。
感谢。
答案 0 :(得分:0)
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;
}