Mục tiêu của tôi là có một chương trình ngủ trong nền nhưng có thể được kích hoạt bởi người dùng thông qua một số "phím nóng". Từ việc đào bới hướng dẫn Xlib và sách hướng dẫn sử dụng Xlib O'reilly, tôi thu thập rằng cách chính xác để thực hiện điều này là với XGrabKey. Tuy nhiên, sự hiểu biết của tôi về quá trình này là không chính xác như một bằng chứng khái niệm đơn giản không hoạt động.Hotkey toàn cầu với X11/Xlib
Sự hiểu biết của tôi là nếu tôi gọi XGrabKey với cửa sổ gốc là grab_window và owner_events sai, thì bất cứ khi nào phím nóng của tôi được nhấn, sự kiện sẽ được gửi chỉ tới cửa sổ gốc. Nếu sau đó tôi chọn các sự kiện KeyPress từ cửa sổ gốc, và sau đó lắng nghe các sự kiện X, tôi sẽ nhận được một sự kiện nhấn phím khi phím nóng được nhấn. Tôi đã dán một ví dụ tối thiểu bên dưới. Điều tôi mong đợi là khi chương trình được chạy, bất kể cửa sổ nào có tiêu điểm, nếu nhấn Ctrl + Shift + K, chương trình của tôi sẽ xuất ra "Phím nóng được nhấn!" trong bảng điều khiển, và sau đó chấm dứt.
Hơn nữa, đó là sự hiểu biết của tôi rằng nếu XGrabKey không thành công, trình xử lý lỗi mặc định sẽ hiển thị thông báo và vì tôi không giả định rằng cuộc gọi thành công.
Rõ ràng, sự hiểu biết của tôi là thiếu sót bằng cách nào đó. ai đó có thể chỉ cho tôi phương hướng đúng không?
#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;
}
Trong mã của bạn, bạn sử dụng 'XK_Y', bạn có thể muốn nói 'XK_K' thay thế? –