免费注册 查看新帖 |

Chinaunix

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

如何用gdk_keyboard_grab函数 捕捉全局按键消息 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-15 14:36 |只看该作者 |倒序浏览
我想在让程序即使失去焦点的时候仍然能捕捉到用户的键盘事件,一个测试的代码如下:

  1. #include <gtk/gtk.h>

  2. Gtkwidget*  create_window_main ()
  3. {
  4. ...
  5. }

  6. static GtkWidget*  window_main;

  7. int main(int argc, char* argv[])
  8. {
  9.   gtk_init(&argc, &argv);

  10.   window_main = create_window_main();

  11.   gdk_keyboard_grab((GDK_WINDOW(window_main->window), TRUE, GDK_CURRENT_TIME);

  12.   gtk_main();

  13.   return 0;
  14. }
复制代码


但是在编译运行的时候,提示这样一个错误:

  1. Gdk-CRITICAL **: gdk_keyboard_grab: assertion `window != NULL' failed
复制代码


并且当程序失去焦点的时候也没能捕捉到全局的键盘消息

论坛徽章:
0
2 [报告]
发表于 2007-08-15 14:42 |只看该作者
调试的时候
window1->window = (GdkWindow* ) 0x8067a78
并不为空

论坛徽章:
0
3 [报告]
发表于 2007-08-15 16:03 |只看该作者
问题已经解决,原来在 gtk_main()主循环开始以后再调用gdk_keyboard_grab((GDK_WINDOW(window_main->window), TRUE, GDK_CURRENT_TIME);
即可,调试的时候发现 window1->window变量在 gtk_main()之前确实为空。

评分

参与人数 1可用积分 +1 收起 理由
whyglinux + 1 我很赞同

查看全部评分

论坛徽章:
0
4 [报告]
发表于 2009-04-27 21:02 |只看该作者
原帖由 hunbuso 于 2007-8-15 16:03 发表
问题已经解决,原来在 gtk_main()主循环开始以后再调用gdk_keyboard_grab((GDK_WINDOW(window_main->window), TRUE, GDK_CURRENT_TIME);
即可,调试的时候发现 window1->window变量在 gtk_main()之前确实为空。

2007年的了,看见回一个吧!
其实只要在gdk_keyboard_grab((GDK_WINDOW(window_main->window), TRUE, GDK_CURRENT_TIME);之前加一个gtk_widget_show(window_main);就可以了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP