无论哪个窗口处于焦点或指针在哪里,我都想记录所有传入的按键事件。
我编写了一个示例代码,它应该捕获当前窗口的按键事件。
#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 来捕获键盘,因为创建窗口的应用程序可能已经抓取了键盘事件。使用上述代码,我能够抓住键盘,但无法在 while 循环内接收键盘上任何键的 KeyPress 或 KeyRelease 事件。由于我无法接收事件,我在代码中是否缺少任何内容?非常感谢任何帮助。
我的最终目标是捕捉屏幕上的按键事件,而不管窗口是否处于焦点。我已经给出了仅聚焦窗口的示例代码,以便代码可读。我会做 XQueryTree 来获取所有 Windows 并应用上面给出的相同逻辑来获得预期的结果。