Linux下拦截键盘消息并选择发送按键消息

探讨了在X11环境下使用C++重发键盘事件的问题,详细展示了如何创建和发送XKeyEvent,但遇到实际键盘消息与重发消息不一致的情况,寻求解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
#include <thread>
#include <unistd.h>

XKeyEvent createKeyEvent(Display *display, Window &win,
                           Window &winRoot, bool press,
                           int keycode, int modifiers)
{
   XKeyEvent event;

   event.display     = display;
   event.window      = win;
   event.root        = winRoot;
   event.subwindow   = None;
   event.time        = CurrentTime;
   event.x           = 1;
   event.y           = 1;
   event.x_root      = 1;
   event.y_root      = 1;
   event.same_screen = True;
   event.keycode     = XKeysymToKeycode(display, keycode);
   event.state       = modifiers;

   if(press)
      event.type = KeyPress;
   else
      event.type = KeyRelease;

   return event;
}

int main(int argc, char **argv)
{
    Display *display;
    XEvent xevent;
    Window window;
    int F4, F6;
    if( (display = XOpenDisplay(NULL)) == NULL )
        return -1;



    window = DefaultRootWindow(display);
    //XAllowEvents(display, AsyncBoth, CurrentTime);

    //XGrabKey(display,XKeysymToKeycode(display,XK_D),None,window,1,GrabModeAsync,GrabModeAsync);

//    F4 = XKeysymToKeycode(display, XStringToKeysym("F5"));
//    //XGrabKey(display, F4, 0, window, True, GrabModeAsync, GrabModeAsync);
//    int result = XGrabKey(display, F4, 0, window, 1, GrabModeAsync, GrabModeAsync);
//    printf("F4 = %d\t result = %d\n",F4,result);
//    XGrabKeyboard(display,
//                 window,
//                 0,
//                 GrabModeAsync,
//                 GrabModeAsync,
//                 CurrentTime);


    while(1) {

        XGrabKeyboard(display,
                     window,
                     1,
                     GrabModeAsync,
                     GrabModeAsync,
                     CurrentTime);

        XNextEvent(display, &xevent);

        switch (xevent.type) {
            case KeyPress:
                printf("%d\n",xevent.xkey.keycode);
                break;
            case KeyRelease:
                printf("%d\n",xevent.xkey.keycode);
                break;
        case MappingNotify:
            printf("%ud\n",xevent.xkey.keycode);
            break;
        }

//        //if(xevent.xkey.keycode == 10)
        XUngrabKeyboard(display,CurrentTime);


        Window winFocus;
        int    revert;
         XGetInputFocus(display, &winFocus, &revert);
      XKeyEvent event = createKeyEvent(display, winFocus, window, true, xevent.xkey.keycode, 0);
      XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);
       printf("keydown\n");

    usleep(10000);

    // Send a fake key release event to the window.XKeysymToKeycode(display,XK_D)
    event = createKeyEvent(display, winFocus, window, false, xevent.xkey.keycode, 0);
    XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);

    printf("keyup\n");
            //getchar();
    }
    getchar();
    return 0;
}

目前重新发送的keycode消息和实际的键盘消息不一致,希望哪位大神能修改下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值