gpt4 book ai didi

c++ - XGrabKeyboard 后无法取消抓取键盘

转载 作者:行者123 更新时间:2023-11-28 04:20:04 24 4
gpt4 key购买 nike

我正在开发一个应用程序,它应该在一段时间内卡住所有输入,包括键盘和鼠标。我试过使用 XGrabKeyboard,但我无法使用 XUngrabKeyboard 恢复它的效果,它什么都不做。

这是一个您可以轻松编译的最小示例:

#include <iostream>
#include <thread>
#include <chrono>

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xresource.h>
#include <X11/cursorfont.h>


int main(int argc, char *argv[])
{
Display * dpy = nullptr;

dpy = XOpenDisplay(0);

if(!dpy)
{
std::cerr << "Error" << std::endl;
return 1;
}

std::cerr << "Grabbing..." << std::endl;

XGrabKeyboard(dpy, DefaultRootWindow(dpy), false, GrabModeAsync, GrabModeAsync, CurrentTime);

std::cerr << "Waiting 2 secs, you shouldn't be able to type anything" << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(2000));


std::cerr << "Ungrabbing..." << std::endl;
XUngrabKeyboard(dpy, CurrentTime);

std::cerr << "Try to type now" << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
}

你可以看到你不能再写任何东西了。我试过点击终端,以防焦点丢失或发生任何事情,但无济于事。程序完成后释放键盘。

不确定它是否与 XGrabKeyboard 调用中的参数有关,我尝试修改它们(同步与异步等)。但是没有区别。

最佳答案

XUngrabKeyboard 之后添加 XSync(dpy, true); (*) 使代码按照您预期的方式运行。所以可能您必须在事件队列恢复之前处理您抓取的所有事件?

(*):实际上不要这样做,这只是为了证明问题出在排队的事件上

也有效:

XUngrabKeyboard(dpy, CurrentTime);
XEvent foo;
while (XPending(dpy)) XNextEvent(dpy, &foo);

更新 - 也有效:

XFlush(dpy);

所以...问题是实际上并没有发送 ungrab?

关于c++ - XGrabKeyboard 后无法取消抓取键盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55651074/

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