是否有可能(或如何)创建一个机制(在Linux X11,C中),它像windows中的全局钩子一样工作(SetWindowsHookEx())?
我希望能够抓住关键事件,但有可能进一步传播。我正在尝试使用XGrabKey解决方案(如xbindkeys)但是当我设置捕获关键事件时,此事件被“消耗”。
该机制的要求如下:
>全局/系统范围 – 无论具有焦点的窗口如何都捕获事件
>“抓住”和“抓住通过”的可能性
>一定很快
示例代码如下所示:
bool myFlagIsSet = false;
XEvent event;
while (true) {
while (XPending(display) > 0) {
usleep(SLEEP_TIME);
}
XNextEvent(display, &event);
switch (e.type) {
case KeyPress:
if (myFlagIsSet) {
//do not propagate
}
// propagate
break;
case KeyRelease:
if (myFlagIsSet) {
//do not propagate
}
// propagate
break;
}
}
在Windows上我简单地写道:
if(event.isConsumed()) {
return LRESULT(1);
}
//...
return CallNextHookEx(hookHandle, nCode, wParam, lParam);
我也尝试过使用XUngrabKey和XSendEvent:
switch (event.type) {
case KeyPress:
if (myFlagIsSet) {
//do not propagate
}
// propagate
XUngrabKey(...);
XSendEvent(..., &event);
XGrabKey(...);
break;
case KeyRelease:
...
}
不幸的是,XSendEvent对我来说原因不明 – 即使XGrabKey行被评论,也不要发送此事件。
是否有可能成功完成这种方法?
如果我被判失败,请建议其他方法
编辑
我想使用Compiz Window Manager在Ubuntu Gnome上实现它