linux - 暂停具有打开菜单的应用程序会卡住 unix 桌面

标签 linux unix x11 xlib suspend

我有这个应用程序,当它重新达到某个 cpu 使用阈值时,它会暂停应用程序。我现在的问题是当我暂停当前打开菜单的应用程序时,它会卡住整个 Centos 桌面。有没有办法在我暂停之前以编程方式取消打开的应用程序菜单?

我的应用程序是用 c++ 编写的,所以我可以使用 xlib/x11,但我似乎无法取消其他应用程序的菜单。我已经使用了 XRaiseWindow() 和假按键事件,但菜单仍然不可触摸。

最佳答案

这是 X11 的一个已知问题。您不能轻易取消其他应用程序的菜单。但是,您可以检查菜单或类似项目是否处于事件状态。为此,请调用 XGrabKeyboardXGrabPointer。如果两次调用都成功,您可以暂停您的应用程序。如果没有,调用XUngrabPointerXUngrabKeyboard,稍等再试。完成后始终取消抓取。

示例代码,尝试正常运行,然后在菜单处于事件状态时运行。

#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/

相关文章:

mysql - 无法打开/proc/net/unix : No such file or directory//invoke-rc. d: 无法确定当前运行级别

c++ - linux环境程序访问地址前如何检查地址合法性?linux?

linux - 访问硬件寄存器中的内存指针

`posix_spawn` 的能力

c++ - 使用 SDL2 调整无边界窗口大小时出现错误

node.js - 流利的ffmpeg如何将X11显示设置为输入

linux - 将裁剪标记添加到 A3 PDF 的命令行方法

linux - 使用 .env 文件运行 shell 脚本

linux - 在 .bash_profile 中从哪里获取 .profile 以在 Cygwin 中安装 RVM?

python - xterm 无法在 mininet 中工作