我有这个应用程序,当它重新达到某个 cpu 使用阈值时,它会暂停应用程序。我现在的问题是当我暂停当前打开菜单的应用程序时,它会卡住整个 Centos 桌面。有没有办法在我暂停之前以编程方式取消打开的应用程序菜单?
我的应用程序是用 c++ 编写的,所以我可以使用 xlib/x11,但我似乎无法取消其他应用程序的菜单。我已经使用了 XRaiseWindow() 和假按键事件,但菜单仍然不可触摸。
最佳答案
这是 X11 的一个已知问题。您不能轻易取消其他应用程序的菜单。但是,您可以检查菜单或类似项目是否处于事件状态。为此,请调用 XGrabKeyboard
和 XGrabPointer
。如果两次调用都成功,您可以暂停您的应用程序。如果没有,调用XUngrabPointer
和XUngrabKeyboard
,稍等再试。完成后始终取消抓取。
示例代码,尝试正常运行,然后在菜单处于事件状态时运行。
#include <stdio.h>
#include <X11/Xlib.h>
int main ()
{
Display* d = XOpenDisplay(NULL);
int res = XGrabKeyboard(d, DefaultRootWindow(d), True, GrabModeAsync, GrabModeAsync, CurrentTime);
if (res == Success)
{
int res = XGrabPointer(d, DefaultRootWindow(d), True, 0, GrabModeAsync, GrabModeAsync, None, None, CurrentTime);
if (res == Success)
{
printf ("Grabbed!\n");
// suspend app here
XUngrabPointer(d, CurrentTime);
}
else
printf ("Could not grab pointer\n");
XUngrabKeyboard(d, CurrentTime);
}
else
printf ("Could not grab keyboard\n");
return 0;
}
关于linux - 暂停具有打开菜单的应用程序会卡住 unix 桌面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28985465/