【发布时间】:2019-04-12 11:54:43
【问题描述】:
我正在开发一个应用程序,它应该在一段时间内冻结所有输入,包括键盘和鼠标。我尝试过使用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 调用中的参数有关,我尝试过修改它们(同步与异步等)。但是没有区别。
【问题讨论】: