我正在尝试全局(而不是在特定的应用程序窗口上)侦听某个键的按下/释放并模拟另一个键,从而抑制原始键。
#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
上面的代码根本无法始终如一地工作。即使没有抓住模拟密钥,它也会检测到它。
我的最终目标还将涉及模拟潜在抓取的钥匙的钥匙。
这是正确的方法吗?我的最终目标是否可能(我的程序可以忽略它自己的模拟键)吗?