Ich versuche, Schlüsselereignisse zu senden, indem ich ein XKeyEvent erzeuge und es mit XSendEvent (inspiriert von this post) sende. Die XKeyEvents werden wie folgt hergestellt:XSendEvent ändert den Status des Modifizierungsschlüssels nicht
XKeyEvent createKeyEvent(Display *display, Window win, Window winRoot, _Bool press, int keycode, int modifiers) {
XKeyEvent event;
event.display = display;
event.window = win;
event.root = winRoot;
event.subwindow = None;
event.time = CurrentTime;
event.x = 1;
event.y = 1;
event.x_root = 1;
event.y_root = 1;
event.same_screen = True;
event.keycode = keycode;
event.state = modifiers;
if (press) {
event.type = KeyPress;
} else {
event.type = KeyRelease;
}
return event;
}
Dann werden sie mit geschickt XSendEvent(event.display, event.window, 1, KeyPressMask, (XEvent *)&event);
Die wichtigsten Ereignisse werden gesendet und das Zielprogramm erhält sie (Buchstaben eingegeben werden, die Pfeiltasten funktionieren etc.). Es treten jedoch Probleme mit Zusatztasten auf. Nehmen wir an, das Programm sendet ein Key-down-Ereignis für die opt/alt-Taste. In diesem Szenario wird der Text in der Menüleiste unterstrichen, bis ein Key-up-Ereignis gesendet wird (das anzeigt, dass der X-Server das Key-Down-Ereignis empfangen und verarbeitet hat).
Wenn Sie jedoch den aktuellen Status der Zusatztasten abrufen, werden die Zusatztasten anscheinend überhaupt nicht gedrückt. Wenn XQueryPointer(self->display, winFocus, &root_return, &child_return, &root_x_return, &root_y_return, &win_x_return, &win_y_return, &keyboard_state_mask);
aufgerufen wird, ist die keyboard_state_mask 0. Das Überprüfen der Tastatur mit xev
gibt das gleiche Ergebnis. Wenn Sie die Modifizierertasten physisch drücken, ändert sich die Statusmaske sowohl in xev
als auch in meinem Code.
Wie ändere ich den aktuellen Modifier-Key-Zustand richtig?
Es ist mir nicht ganz klar, aber erwarten Sie, dass die X11-Server-Ansicht des Status der Tastaturmodifikatoren von den von Ihnen gesendeten Ereignissen beeinflusst wird? –
Ja, ich erwarte, dass das passiert. –