gpt4 book ai didi

c - 为什么我不能从我的循环中捕获这些 KeyPress/KeyRelease 事件?

转载 作者:行者123 更新时间:2023-12-04 16:27:58 26 4
gpt4 key购买 nike

我想记录所有传入的按键事件,无论哪个窗口处于焦点或指针在哪里。我已经编写了示例代码,它应该捕获当前窗口的按键事件(见下文)。为了保持我的代码可读性,我只给出了焦点窗口的示例代码。由于我的最终目标是捕捉屏幕上的按键事件,而不考虑焦点窗口,我计划使用 XQueryTree获取所有 Windows 并应用相同的逻辑。

我调用 XGrabKeyboard捕获键盘,因为焦点窗口可能已经在捕获键盘事件。使用我的示例代码,我可以捕获键盘,但无法接收 KeyPressKeyRelease while 中任何键盘键的事件环形。

我在代码中遗漏了什么以允许我接收事件?

示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <locale.h>
#include <stdint.h>
#include <stdarg.h>
#include <errno.h>
#include <pthread.h>
#include <X11/Xlib.h>
#include <X11/Xos.h>
#include <X11/Xfuncs.h>
#include <X11/Xutil.h>

#include <X11/Xatom.h>
int _invalid_window_handler(Display *dsp, XErrorEvent *err) {
return 0;
}

int main()
{
Display *display = XOpenDisplay(NULL);
int iError;
KeySym k;
int revert_to;
Window window;
XEvent event;
Time time;
XSetErrorHandler(_invalid_window_handler);
XGetInputFocus(display, &window, &revert_to);
XSelectInput(display, window, KeyPressMask | KeyReleaseMask );
iError = XGrabKeyboard(display, window,
KeyPressMask | KeyReleaseMask,
GrabModeAsync,
GrabModeAsync,
CurrentTime);
if (iError != GrabSuccess && iError == AlreadyGrabbed) {
XUngrabPointer(display, CurrentTime);
XFlush(display);
printf("Already Grabbed\n");
} else if (iError == GrabSuccess) {
printf("Grabbed\n");
}
while(1) {
XNextEvent(display,&event);
switch (event.type) {
case KeyPress : printf("Key Pressed\n"); break;
case KeyRelease : printf("Key Released\n"); break;
case EnterNotify : printf("Enter\n"); break;
}
}
XCloseDisplay(display);
return 0;
}

最佳答案

XGrabKeyboard 的参数 3 是引用手册页:

owner_events : Specifies a Boolean value that indicates whether the keyboard events are to be reported as usual.



所以应该是真或假,而不是事件掩码。

关于c - 为什么我不能从我的循环中捕获这些 KeyPress/KeyRelease 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11294545/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com