免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4068 | 回复: 1
打印 上一主题 下一主题

为何单独Gdk_BackSpace这个按键不能模拟 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-21 15:21 |只看该作者 |倒序浏览
在模拟一些按键的时候,偏偏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);来模拟,其他键都可以,偏偏这个不行

论坛徽章:
0
2 [报告]
发表于 2008-09-09 09:09 |只看该作者
如果哪个按键模拟不了,就看看在标准键盘上按下这个键盘输出的是什么

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=%d\n",
                                        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();
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP