Mein Ziel ist es, ein Programm zu haben, das im Hintergrund schläft, aber vom Benutzer über einen "Hotkey" aktiviert werden kann. Beim Durchforsten des Xlib-Handbuchs und des Xlib O'reilly-Handbuchs erkläre ich, dass der korrekte Weg dahin XGrabKey ist. Mein Verständnis des Prozesses ist jedoch falsch, da ein einfacher Proof of Concept nicht funktioniert.Global Hotkey mit X11/Xlib
Mein Verständnis ist, dass, wenn ich XGrabKey mit dem Root-Fenster als grab_window nennen, und owner_events falsch ist, dann, wenn mein Hotkey das Ereignis gedrückt wird nur in das Stammfenster gesendet werden. Wenn ich KeyPress-Ereignisse aus dem Hauptfenster auswähle und dann auf X-Ereignisse lausche, sollte ich beim Drücken des Hotkeys ein Tastendruckereignis erhalten. Ich habe unten ein minimales Beispiel eingefügt.
Was ich erwarte ist, dass, wenn das Programm ausgeführt wird, unabhängig davon, welches Fenster Fokus hat, wenn Strg + Shift + K gedrückt wird, sollte mein Programm "Hotkey gedrückt!" in der Konsole und dann beenden.
Darüber hinaus ist es mein Verständnis, dass, wenn der XGrabKey fehlschlägt, der Standardfehlerhandler eine Nachricht anzeigen wird, und da ich nicht davon ausgehe, dass der Aufruf erfolgreich ist.
Offensichtlich ist mein Verständnis irgendwie fehlerhaft. Kann mir jemand in die richtige Richtung zeigen?
#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;
}
In Ihrem Code Sie 'XK_Y' verwenden, können Sie Möchtest du stattdessen 'XK_K' sagen? –