5

次のコード スニペットは、特定のウィンドウを除いて、ほとんどの場合に機能します。たとえば、最新の Ubuntu では、ファイル エクスプローラーでフォルダーを選択することはできません。他のどこでも機能しているように見えますが、このギャップは重大です。XQueryPointer の使用方法に関係していると思われますが、見つけられるほぼすべての例を試しました。代わりにコンピューターのマウスを使用すると、問題なく動作します。参考までに: これらの質問に対する回答は既に試しました: Sending Programmatic events Capuring Mouse Input ですが、違いはありません...

コードは次のとおりです。

#include <string.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

void SendClick(int button, int down) {
    Display *display = XOpenDisplay(NULL);
    XEvent event;

    if(display == NULL)
    {
        return;
    }

    memset(&event, 0, sizeof(event));

    event.xbutton.button = button;
    event.xbutton.same_screen = True;
    event.xbutton.subwindow = DefaultRootWindow (display);

    while (event.xbutton.subwindow)
    {
      event.xbutton.window = event.xbutton.subwindow;
      XQueryPointer (display, event.xbutton.window,
             &event.xbutton.root, &event.xbutton.subwindow,
             &event.xbutton.x_root, &event.xbutton.y_root,
             &event.xbutton.x, &event.xbutton.y,
             &event.xbutton.state);
    }

    event.type = down ? ButtonPress : ButtonRelease;

    XSendEvent(display, PointerWindow, True, down ? ButtonPressMask : ButtonReleaseMask, &event); 

    XFlush(display);

    XCloseDisplay(display);
}
4

2 に答える 2

5

私を正しい軌道に乗せてくれた上記のninjaljのコメントに感謝します。これを行うために拡張機能に依存するという考えと、それによって作成される余分な依存関係は好きではありませんが、これもかなり標準的な拡張機能です。完璧に動作します...

私と同じ問題に遭遇した人のために、次のコードブロックは以前に使用していたコードを置き換え、うまく機能します:

#include <X11/extensions/XTest.h>

void SendClick(int button, Bool down) {
    Display *display = XOpenDisplay(NULL);
    XTestFakeButtonEvent(display, button, down, CurrentTime);
    XFlush(display);
    XCloseDisplay(display);
}

もっと短い!

Ubuntu の場合は、libxtst-dev パッケージをインストールすることを忘れないでください。-lXtst を LDFLAGS に必ず追加してください。

于 2012-10-03T23:39:42.910 に答える
1

このリンクも役立ちます。

XTest 拡張機能を使用した X11 フェイク マウス イベントの生成 http://bharathisubramanian.wordpress.com/2010/04/01/x11-fake-mouse-events-generation-using-xtest/

XTest 拡張機能を使用して偽のキーボード イベントを生成する方法を説明するリンクを次に示します。

XTest 拡張機能を使用した X11 偽キー イベントの生成 http://bharathisubramanian.wordpress.com/2010/03/14/x11-fake-key-event-generation-using-xtest-ext/

于 2014-07-01T21:14:52.407 に答える