也是API DOC中有。 下面是简单使用的代码。
更详细的可以看文档或者gtk源代码。gdkkeysyms.h gdkkeysyms.c
头文件#include <gdk/gdkkeysyms.h>
#include <gdk/gdkevents.h>
下面是占用按键。这个grab的模式是后来后得,谁最后grab了,就是谁的。就像是入栈出栈一样。谁在栈尾,谁享受按键。
一旦你grab了一个按键 ,那么,这个按键动作就会一直发送到你的程序,直到有新的程序起来了,并grab它,或者你ungrab. int keyID;
gdk_key_grab(NULL, GDK_End_k,0,TRUE);// 这三个就是主面板的三个键。
gdk_key_grab(NULL, GDK_Send,0,TRUE);
gdk_key_grab(NULL, GDK_Home_k,0,TRUE);
keyID = gtk_key_snooper_install(key_snoop, window);//函数。
key_snoop响应按键。gint key_snoop(GtkWidget* widget, GdkEventKey* event, gpointer data)
{
//我这里三个键按下去都是将程序窗口隐藏起来。
if(widget == NULL)
{
switch(event->keyval)
{
case GDK_End_k:
k_hide_window(data);
return TRUE;
case GDK_Send:
k_hide_window(data);
return TRUE;
case GDK_Home_k:
k_hide_window(data);
return TRUE;
default:
return FALSE;
}
}
return FALSE;
}
实现,,,,记得隐藏起来后要把按键注销了。。要不然你程序隐藏起来了按键消息还往你那发。void k_hide_window(gpointer data)
{
fprintf(stderr,"======= main window hide =========\n");
gtk_window_iconify(GTK_WINDOW(data));//将窗口隐藏起来
gdk_key_ungrab(NULL, GDK_End_k,0);
gdk_key_ungrab(NULL, GDK_Send,0);
gdk_key_ungrab(NULL, GDK_Home_k,0);
}
比如说我是通过订阅了一个消息将窗口激活的。
这个回调函数是这样的,将窗口显示出来之后又要将那些按键重新grab到。gboolean __OnNotifyDeiconify(EvtSysEventSourceId_t source_id, const char* noti_id, const GArray* properties, void* priv_data)
{
EvtSysEventProperty_t* e;
e = &g_array_index(properties, EvtSysEventProperty_t, 0);
if(strcmp(e->value.s, "com.heimutuzhu.heyc.deiconify") == 0)
{
fprintf(stderr,"=== com.heimutuzhu.heyc.deiconify received.====\n");
gtk_window_deiconify(GTK_WINDOW(priv_data));//将窗口重新显示出来。
gdk_key_grab(NULL, GDK_End_k,0,TRUE);
gdk_key_grab(NULL, GDK_Send,0,TRUE);//再次grab这些按键
gdk_key_grab(NULL, GDK_Home_k,0,TRUE);
fprintf(stderr,"======= main window show =========\n");
}
return TRUE;
}