xlib - XSelectInput 不适用于 ButtonPressEvents,怎么办?

标签 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;

}

最佳答案

当您使用根窗口时,可能还有其他东西获取事件,以确保获取所有事件,您需要捕获鼠标,但没有其他任何东西可以获取事件,因此您需要一种退出方式,例如 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;

}

关于xlib - XSelectInput 不适用于 ButtonPressEvents,怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16977872/

相关文章:

c++ - 在 X11 中监听键盘事件而不消耗它们 - 键盘 Hook

c - 如何从X服务器读取鼠标点击事件

c++ - 使用 XGrabKey 或 XGrabKeyboard 重定向键盘输入

c - _NET_ACTIVE_WINDOW 和 XGetInputFocus 之间的 Xlib 区别

python - 在 Ubuntu/GNOME 上使用 PyQt 将窗口放置在桌面图标后面

c - 获取当前 X11 服务器时间

linux - Xtst 和 usleep

linux - Xlib xinput 测试设备状态是否挂起

c++ - C++中的X11-调整窗口大小时只要设置ResizeRedirectMask,就会发生裁剪

c++ - 如何释放在此函数中创建的内存?