我正在用C编写一个简单的程序,我想要捕获正在发生的所有鼠标和键盘事件。我试图使用“XGrabPointer”,但它导致锁定屏幕,我无法转到其他应用程序。我试过“XSelectInput()”,现在我成功收到了键盘事件,但我没有得到任何鼠标点击事件。
知道我该怎么办?
代码段如下:
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
int main(int argc, char **argv)
{
Display *dpy;
Window root;
unsigned long event_mask;
event_mask = FocusChangeMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask;
if((dpy = XOpenDisplay(NULL)) == NULL) {
perror(argv[0]);
exit(1);
}
dpy = XOpenDisplay(NULL);
root = XDefaultRootWindow(dpy);
int state;
XWindowAttributes attributes;
XGetInputFocus(dpy,&root,&state);
printf("window id = %d\n");
XSelectInput(dpy,root,event_mask);
XEvent ev;
while(1) {
XNextEvent(dpy, &ev);
if(ev.type==ButtonRelease){
printf("button release\n");
}
if (ev.type== KeyPress) {
printf("keypress event\n");
}
}
return 0;
}
当您使用根窗口时,可能还有其他事件可以获取事件,以确保您获得了抓取鼠标所需的所有事件,但没有其他任何事情可以获取事件,因此您需要一种方法来退出,如q键这个例子:
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
int main(int argc, char **argv)
{
Display *dpy;
Window root;
unsigned long event_mask;
event_mask = KeyReleaseMask | ButtonReleaseMask;
if((dpy = XOpenDisplay(NULL)) == NULL) {
perror(argv[0]);
exit(1);
}
dpy = XOpenDisplay(NULL);
root = XDefaultRootWindow(dpy);
XGrabPointer(dpy, root, False, ButtonReleaseMask, GrabModeAsync,
GrabModeAsync, None, None, CurrentTime);
int state;
XWindowAttributes attributes;
XGetInputFocus(dpy,&root,&state);
printf("window id = %d\n");
XSelectInput(dpy,root,event_mask);
XEvent ev;
while(1) {
XNextEvent(dpy, &ev);
printf("Type: %d\n", ev.type);
if(ev.type==ButtonRelease){
printf("button release\n");
}
if (ev.type== KeyRelease) {
printf("keypress event\n");
if (XLookupKeysym(&ev.xkey, 0) == XK_q) {
exit(0);
}
}
}
return 0;
}