【发布时间】:2016-02-22 07:57:44
【问题描述】:
我正在用 C 语言编写一个将使用 Xlib、GTK 的应用程序。 我想创建一个热键来中断应用程序的活动并将其置于休眠状态。
我已经阅读了一些内容,但我相信我无法使用: XGrabKey 因为一个窗口管理器正在运行并且已经在这样做了
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 系统错误。 这可能反映了程序中的错误。 错误是“BadAccess(尝试访问私有资源被拒绝)”。 (详情:serial 7 error_code 10 request_code 33 minor_code 0) (程序员注意:通常X错误是异步报告的; 也就是说,您将在导致错误后的一段时间内收到错误。 要调试您的程序,请使用 --sync 命令行运行它 更改此行为的选项。然后你可以得到一个有意义的 如果您在 gdk_x_error() 函数上中断,则从调试器回溯。) 中止...
谢谢
【问题讨论】:
-
这是我正在尝试的:Display* dpy = XOpenDisplay(0);窗口根 = DefaultRootWindow(dpy); XEvent EV;无符号整数修饰符 = ControlMask |移位掩码; int键码= 45; int pointer_mode = GrabModeAsync; int 键盘模式 = GrabModeAsync; XGrabKey(dpy, AnyKey, 修饰符, root, 0, pointer_mode, keyboard_mode); XSelectInput(dpy, root, KeyPressMask); while(1) { XNextEvent(dpy, &ev); if (ev.type == KeyPress) { printf("键已被按下\n");休息; } else printf("事件类型为 %i\n",ev.type);
-
我得到:Gdk-ERROR **:程序“测试”收到 X Window 系统错误。这可能反映了程序中的错误。错误是“BadAccess(尝试访问私有资源被拒绝)”。 (详情:serial 7 error_code 10 request_code 33 minor_code 0) (程序员注意:通常,X错误是异步报告的,也就是说,你会在导致错误后一段时间收到错误。要调试程序,请使用--同步命令行选项来更改此行为。如果您在 gdk_x_error() 函数上中断,则可以从调试器中获得有意义的回溯。)