1

以下は、マウス クリックを送信するサンプル コードです (xlib を使用)。簡単にするために、イベントはフルスクリーン ウィンドウ (ルートとウィンドウの座標は同じ) に送信され、wmctrl を使用してウィンドウ ID が取得されます。

Display *display = XOpenDisplay(NULL);
XWarpPointer(display, None, RootWindow(display, DefaultScreen(display)), 0, 0, 0, 0, 300, 200);
XEvent event;
memset(&event, 0x00, sizeof(event));
event.type = ButtonPress;
event.xbutton.button = button;
event.xbutton.same_screen = True;
event.xbutton.root = RootWindow(display, DefaultScreen(display));
event.xbutton.window = 81788929;
event.xbutton.subwindow = 0;
event.xbutton.x_root = 300;
event.xbutton.y_root = 200;
event.xbutton.x = 300;
event.xbutton.y = 200;
event.xbutton.state = 0;

XSendEvent(display, PointerWindow, True, ButtonPressMask, &event);
XFlush(display);
XCloseDisplay(display);

上記のコードは正常に動作します。私はそれをxcbに移植しました:

Display *display = XOpenDisplay(NULL);
XWarpPointer(display, None, RootWindow(display, DefaultScreen(display)), 0, 0, 0, 0, 300, 200);


xcb_button_press_event_t event;
memset(&event, 0x00, sizeof(event));
event.event = 81788929;
event.same_screen = 1;
event.root = RootWindow(display, DefaultScreen(display));
event.root_x = 300;
event.root_y = 200;
event.event_x = 300;
event.event_y = 200;
event.child = 0;
event.state = 0;

xcb_connection_t *conn = XGetXCBConnection(display);
xcb_send_event(conn, false, 81788929, XCB_EVENT_MASK_BUTTON_PRESS, (char*)(&event));
xcb_flush(conn);
XCloseDisplay(display);

XCB コードが機能しない: 宛先ウィンドウがイベントを取得しません。なにが問題ですか ?

Edit1 接続に次のコードを使用すると:

xcb_connection_t *conn;
xcb_screen_t     *screen;
conn = xcb_connect (NULL, NULL);
screen = xcb_setup_roots_iterator (xcb_get_setup (conn)).data;

以降:

event.root = screen->root;

それも機能しません。

4

1 に答える 1

1

コードのどこにもエラー チェックはありません。とにかく、XGetXCBConnection(display);有効な Xcb 接続が返されないのではないかと思います。なぜあなたは尋ねることができますか?これが機能するためには、Xlib が Xcb のラッパーとしてビルドされ、内部構造が適切に設定されている必要があります。

接続を作成し、純粋に Xcb でディスプレイを開いて、これで問題が解決するかどうかを確認することをお勧めします。

于 2015-01-07T10:40:57.043 に答える