XSelectInput不适用于ButtonPressEvents,怎么做?

时间:2013-06-07 06:46:03

标签: xlib

我正在用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;

}

1 个答案:

答案 0 :(得分:2)

当您使用根窗口时,可能还有其他事情可以获取事件,以确保您获得了抓取鼠标所需的所有事件,但没有其他任何事情可以获取事件,因此您需要一种方法来退出这个例子中的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;

}