为何单独Gdk_BackSpace这个按键不能模拟

发布于 2022-08-09 17:41:40 字数 691 浏览 7 评论 1

在模拟一些按键的时候,偏偏Gdk_BackSpace这个不行,查了下它的编码是0xff08,而我模拟的其他按键都在256一下。
不知道如何去模拟大于这之类的,求教。

        [xx_KEY_T] = GDK_t,
        [xx_KEY_U] = GDK_u,
        [xx_KEY_V] = GDK_v,
        [xx_KEY_W] = GDK_w,
        [xx_KEY_X] = GDK_x,
        [xx_KEY_Y] = GDK_y,
        [xx_KEY_Z] = GDK_z, //A-Z

        [xx_KEY_SPACE] = GDK_space,
        [xx_KEY_BACKSPACE] = GDK_BackSpace, //无效

使用gtk_main_do_event(event);来模拟,其他键都可以,偏偏这个不行

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

肥爪爪 2022-08-11 07:32:19

如果哪个按键模拟不了,就看看在标准键盘上按下这个键盘输出的是什么

gint snooper_func(GtkWidget *widget,GdkEventKey *event,gpointer data)
{
        switch(event->keyval){
                case GDK_BackSpace:
                        dprintk("KEY:'%s',keyval=0x%x,state=%d,leng=%d,string='%s',code=%d,is_modify=%dn",
                                        gdk_keyval_name(event->keyval),event->keyval,event->state,
                                        event->length,event->string,event->hardware_keycode,event->is_modifier);
                        break;
        }       

        return FALSE;
}

gtk_key_snooper_install(snooper_func,NULL);

//FIXME:模拟退格键一定要指定hardware_keycode为22
static void simulate_key(GtkWidget *window,int keyval,int press)
{
        GdkEvent *event;
        GdkEventType type;
        //GtkWidget *widget;
       
        //这里只是获取这个主窗口的焦点
        //如果要在当前程序中模拟按键,就不要指定焦点了,这时候要用gtk_main_do_event,
        //widget = gtk_window_get_focus(GTK_WINDOW(wbus->window));

        if(press) //按键按下       
                type = GDK_KEY_PRESS;
        else //释放
                type = GDK_KEY_RELEASE;

        event = gdk_event_new(type);

        event->key.send_event = TRUE;
        event->key.keyval = keyval;
        event->key.window = window->window; //一定要设置为主窗口
        //event->key.window = gtk_widget_get_toplevel(window)->window;//FIXME:备用
       
        g_object_ref(event->key.window);

        if(keyval == GDK_BackSpace){
                //event->key.state = GDK_MOD2_MASK; //16;       
                event->key.hardware_keycode = 22; //FIXME:一定要用这个,要不然模拟不了
        }
       
        gdk_threads_enter();

        //FIXME: 记得用这个来发送事件
        gtk_main_do_event(event);
        gdk_event_free(event);

        gdk_display_flush(gdk_display_get_default());
        gdk_threads_leave();
}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文