【问题标题】:How to send key event to application using XCB?如何使用 XCB 向应用程序发送关键事件?
【发布时间】:2012-02-06 07:44:22
【问题描述】:

如何使用XCB从另一个程序向窗口(当前活动窗口)发送按键或按键释放事件?

我找到了一些使用XLib 的教程,但是我想使用XCB

我想我得打电话给xcb_send_event,但是我不知道要传递什么作为参数。

【问题讨论】:

  • 您应该注意,大多数应用程序会阻止 send_events(),因为它是一个公然的安全整体。早在 X11 的早期,我们就用它来输入其他用户的 xterms。 :-)
  • 我正在尝试记录我的按键然后再次播放它们,即记录宏以节省时间。
  • 你最好在应用程序级别上做而不是在 X11 的低级别上做。

标签: c++ c x11 xcb


【解决方案1】:

您应该能够使用 XTEST 扩展来伪造活动窗口的输入,使用 xcb_test_fake_input() 函数。

#include <xcb/xtest.h>
...
xcb_test_fake_input(c, XCB_KEY_PRESS, keycode, XCB_CURRENT_TIME, XCB_NONE, 0, 0, 0);
xcb_test_fake_input(c, XCB_KEY_RELEASE, keycode, XCB_CURRENT_TIME, XCB_NONE, 0, 0, 0);

有关工作示例,请参阅 xte program in xcb/demos

【讨论】:

  • 感谢您分享这个!大多数应用程序都阻止了send_eventtest_fake_input 听起来好像可以解决问题。用 g++ 编译有什么要包括的吗?我目前使用g++ main.cc -o trigger -std=c++11 -lxcb 编译。谢谢!
  • @Noitidart 我能够使用-lxcb-xtest 进行编译。 (例如gcc test.c -lxcb -lxcb-xtest -o test)。我必须安装包libxcb-xtest0-dev
【解决方案2】:

可能的替代方案:xcb_send_event()

见: X11R7.7 API Documentation

那里的例子:

/*
 * Tell the given window that it was configured to a size of 800x600 pixels.
 */
void my_example(xcb_connection_t* conn, xcb_window_t window) {

    //
    // Every X11 event is 32 bytes long. Therefore, XCB will copy 32 bytes.
    // In order to properly initialize these bytes, we allocate 32 bytes even
    // though we only need less for an xcb_configure_notify_event_t
    //
    xcb_configure_notify_event_t* event = calloc(32, 1);

    event->event = window;
    event->window = window;
    event->response_type = XCB_CONFIGURE_NOTIFY;

    event->x = 0;
    event->y = 0;
    event->width = 800;
    event->height = 600;

    event->border_width = 0;
    event->above_sibling = XCB_NONE;
    event->override_redirect = false;

    xcb_send_event(conn, false, window, XCB_EVENT_MASK_STRUCTURE_NOTIFY, (char*) event);
    xcb_flush(conn);
    free(event);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2014-01-21
    • 2021-08-14
    • 2017-03-12
    • 2012-09-01
    • 2022-11-28
    相关资源
    最近更新 更多