我的目標是讓一個程序在後臺睡覺,但可以通過用戶通過一些「熱鍵」激活。從圍繞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