我的目标是让一个程序在后台睡觉,但可以通过用户通过一些“热键”激活。从围绕Xlib手册和Xlib O'reilly手册开始,我了解到正确的方法是使用XGrabKey。然而,我对这个过程的理解是不正确的,因为一个简单的概念证明不起作用。X11/Xlib全球热键
我的理解是,如果我叫XGrabKey与根窗口作为grab_window和owner_events假的,那么只要按下快捷键我的事件将被发送仅到根窗口。如果我然后从根窗口中选择KeyPress事件,然后监听X事件,那么当按下热键时,我应该得到一个按键事件。我在下面贴了一个简单的例子。
我期望的是当程序运行时,不管窗口有什么焦点,如果按下Ctrl + Shift + K,我的程序应该输出“Hot key pressed!”在控制台中,然后终止。此外,这是我的理解,如果XGrabKey失败,默认错误处理程序将显示一条消息,因为它不,我假设调用成功。
显然,我的理解有点不对。任何人都可以将我指向正确的方向吗?
#include <iostream>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
using namespace std;
int main()
{
Display* dpy = XOpenDisplay(0);
Window root = DefaultRootWindow(dpy);
XEvent ev;
unsigned int modifiers = ControlMask | ShiftMask;
int keycode = XKeysymToKeycode(dpy,XK_Y);
Window grab_window = root;
Bool owner_events = False;
int pointer_mode = GrabModeAsync;
int keyboard_mode = GrabModeAsync;
XGrabKey(dpy, keycode, modifiers, grab_window, owner_events, pointer_mode,
keyboard_mode);
XSelectInput(dpy, root, KeyPressMask);
while(true)
{
bool shouldQuit = false;
XNextEvent(dpy, &ev);
switch(ev.type)
{
case KeyPress:
cout << "Hot key pressed!" << endl;
XUngrabKey(dpy,keycode,modifiers,grab_window);
shouldQuit = true;
default:
break;
}
if(shouldQuit)
break;
}
XCloseDisplay(dpy);
return 0;
}
在你的代码使用'XK_Y',你可能想要说'XK_K'吗? – 2012-12-21 18:51:17