2016-06-29 19 views
0

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と私のコードの両方で状態マスクが変わります。

現在の修飾キーの状態を正しく変更するにはどうすればよいですか?

+0

私には明らかではありませんが、送信したイベントの影響を受けるキーボード修飾子の状態のX11サーバーの表示を期待していますか? –

+0

はい、私はそれが起こることを期待しています。 –

答えて

0

ライブラリ<X11/extensions/XTest.h>int XTestFakeButtonEvent(display, button, is_press, delay)メソッドを使用して問題を解決しました。何らかの理由で、修飾キーを送信したときにキーボード修飾子の状態が変化します(私が望むように)。しかし、上記の方法はそうではありません。 xsendevent manページから

0

「転送イベントでTrueにのsend_eventを強制するために、正しくイベントでシリアル番号を設定することを除い以外のイベントの内容は、Xサーバによってそれ以外の場合は変更されないし、未チェックです。 "

は、私はあなたが以下の場所からcreateKeyEventを()にコピーすることを前提としていますhttp://www.doctort.org/adam/nerd-notes/x11-fake-keypress-event.html

そして、あなたはまた、この関数が呼び出される方法コピーした場合:(

createKeyEventを表示、winFocus、WINROOT、偽、KEYCODE、 0)。

最後の引数が "0"であるため、 "修飾子"には何も設定されていません。ドキュメントによると、修飾子の状態を自分で設定する必要があります。

私はこの情報を確認しませんでした。文書化されているように動作しない場合は、ドキュメントのバグやXサーバの実装上のバグかもしれません。

関連する問題