在按键上模拟按键

时间:2020-05-31 14:44:52

标签: c keyboard x11 xcb

我正在尝试全局(而不是在特定的应用程序窗口上)侦听某个键的按下/释放并模拟另一个键,从而抑制原始键。

#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>

#include <xcb/xcb.h>  // requires -lxcb
#include <xcb/xtest.h>  // requires -lxcb-test

void sim_key_press(xcb_connection_t *xcon, xcb_keycode_t kc) {
    xcb_test_fake_input(xcon, XCB_KEY_PRESS, kc, XCB_CURRENT_TIME, XCB_NONE, 0, 0, 0);
    xcb_flush(xcon);
}

void sim_key_release(xcb_connection_t *xcon, xcb_keycode_t kc) {
    xcb_test_fake_input(xcon, XCB_KEY_RELEASE, kc, XCB_CURRENT_TIME, XCB_NONE, 0, 0, 0);
    xcb_flush(xcon);
}

int main() {
    const xcb_keycode_t GRAB_KEY = 65;
    const xcb_keycode_t SIM_KEY = 38;

    xcb_connection_t *xcon = xcb_connect(NULL, NULL);
    xcb_screen_t *xscreen = xcb_setup_roots_iterator(xcb_get_setup(xcon)).data;

    xcb_grab_key(xcon, 1, xscreen->root, XCB_NONE, GRAB_KEY, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);

    xcb_flush(xcon);

    xcb_generic_event_t *event;
    while ( (event = xcb_wait_for_event(xcon)) ) {
        switch (event->response_type & ~0x80) {
            case XCB_KEY_PRESS: {
                xcb_keycode_t kc = ((xcb_key_press_event_t *)event)->detail;
                printf("key press: %u\n", kc);  // debug
                sim_key_press(xcon, SIM_KEY);
                break;
            }
            case XCB_KEY_RELEASE: {
                xcb_keycode_t kc = ((xcb_key_release_event_t *)event)->detail;
                printf("key release: %u\n", kc);  // debug
                sim_key_release(xcon, SIM_KEY);
                break;
            }
        }
        free(event);
    }
}

构建方式:

gcc -lxcb -lxcb-xtest c.c

上面的代码根本无法始终如一地工作。即使没有抓住模拟密钥,它也会检测到它。

我的最终目标还将涉及模拟潜在抓取的钥匙的钥匙。

这是正确的方法吗?我的最终目标是否可能(我的程序可以忽略它自己的模拟键)吗?

0 个答案:

没有答案