c - Xlib 的全局热键

标签 c linux gtk xlib

我正在用 c 编写一个应用程序,它将使用 Xlib、GTK。 我想创建一个热键来中断应用程序的事件并将其置于休眠状态。

我已经阅读了一些资料,但我相信我不能使用: X抓取键 因为窗口管理器正在运行并且已经在运行了

当应用程序没有焦点时,是否有任何其他方法可以从 gtk 或 Xlib 中按组合键向我的应用程序发送订单?

我正在尝试以下代码,但它不起作用:

Display* dpy = XOpenDisplay(0);
    Window root = DefaultRootWindow(dpy);
    XEvent ev;
    unsigned int modifiers = ControlMask | ShiftMask;
    int keycode = 45;
    int pointer_mode = GrabModeAsync;
    int keyboard_mode = GrabModeAsync;
    XGrabKey(dpy, AnyKey, modifiers, root, 0, pointer_mode, keyboard_mode);
    XSelectInput(dpy, root, KeyPressMask);
    while(1)
    {
      XNextEvent(dpy, &ev);
      if (ev.type == KeyPress)
      {
        printf("key has been pressed\n");
        break;
      }
      else printf("event type is %i\n",ev.type);

    }

但我得到: Gdk-ERROR **:程序“test”收到 X Window System 错误。 这可能反射(reflect)了程序中的错误。 错误是“BadAccess(尝试访问私有(private)资源被拒绝)”。 (详细信息:序列号 7 error_code 10 request_code 33 minor_code 0) (程序员注意:通常情况下,X 错误是异步报告的; 也就是说,您将在导致错误一段时间后收到错误。 要调试您的程序,请使用 --sync 命令行运行它 更改此行为的选项。然后你可以得到一个有意义的 如果你中断 gdk_x_error() 函数,从你的调试器回溯。) 中止...

谢谢

最佳答案

这意味着另一个程序已经绑定(bind)了 Control+Shift+"-"。尝试捕获另一个组合键。

关于c - Xlib 的全局热键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33816364/

相关文章:

c++ - 小部件不在 Gtk 窗口内

为 GTK+ 配置 Qt Creator

linux - echo、grep 和设置变量问题

android - 捕获 android 应用程序 http 流量

linux - 我应该将数据库和 CMS 文件放在单独的 EBS 或 S3 上吗?

c++ - 关闭 GTK 窗口

C 到 MIPS 转换

c - 在不同的头文件中定义 ARGS 有什么用?

检查 Linux C 中 pthread 是否仍然存在

c - 如何在 lex.l 文件之外使用 flex 函数?