XKeyEventを作成し、XSendEventを使用して送信することでキーイベントを送信しようとしています(thisから触発)。次のようにXKeyEventsが用意されています XSendEventは修飾キーの状態を変更しません
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;
}
はその後、彼らは
XSendEvent(event.display, event.window, 1, KeyPressMask, (XEvent *)&event);
して送信され、キーイベントが送信され、ターゲットプログラムがそれらを受け取る(文字が入力され、矢印キーなど働きます)。ただし、修飾キーで問題が発生します。プログラムがopt/altキーのキーダウンイベントを送信したとします。このシナリオでは、キーアップイベントが送信される(Xサーバーがキーダウンイベントを受信して処理したことを示す)まで、メニューバーのテキストに下線が引かれます。
ただし、モディファイアキーの現在の状態を取得する場合、モディファイアキーはまったく押されていないようです。 XQueryPointer(self->display, winFocus, &root_return, &child_return, &root_x_return, &root_y_return, &win_x_return, &win_y_return, &keyboard_state_mask);
を呼び出すと、keyboard_state_maskは0になります。キーボードをxev
にチェックすると同じ結果が得られます。モディファイアキーを物理的に押すと、xev
と私のコードの両方で状態マスクが変わります。
現在の修飾キーの状態を正しく変更するにはどうすればよいですか?
私には明らかではありませんが、送信したイベントの影響を受けるキーボード修飾子の状態のX11サーバーの表示を期待していますか? –
はい、私はそれが起こることを期待しています。 –