GTK 在事件與信號處理這一塊比較複雜,以下是我調查整理的兩種處理鍵盤按鍵信號的方法。
方法一,這個方法可以讓F10信號被屏蔽:
在 gtk 的 .gtkrc 配置文件中加如下代碼:
gtk-menu-bar-accel = ""
binding "NoKeyboardNavigation" {
unbind "<shift>F10"
}
class "*" binding "NoKeyboardNavigation
注意:這可能只對 F10 有效,將代碼中的F10改成其他值,可能不行。
上面這段代碼來自於:https://bbs.archlinux.org/viewtopic.php?id=129872
方法二:
在 gtk 中,捕捉鍵盤按鍵信號 “key-press-event”,從而屏蔽它,想屏蔽哪那個按鍵信號,就檢查按鍵信號處理函數是否有該按鍵信號,若有讓回調函數返回 TRUE,其餘情況返回FALSE。可以修改如下代碼來驗證。
代碼如下,該程序實現了建立一個gtk窗口,並從鍵盤捕捉按鍵信號。
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <glib.h>
#include <glib/gprintf.h>
#include <stdlib.h>
#include <string.h>
#include <gdk/gdkkeysyms.h>
/*按鍵信號處理回調函數*/
gboolean key_value(GtkWidget *widget, GdkEventKey *event, gpointer data)
{
GtkWidget *label = (GtkWidget *)data;
guint keyvalue = event->keyval;
gchar temp[100];
strcpy(temp, "press: ");
if(event->state & GDK_CONTROL_MASK)
strcat(temp, "CTRL+");
if(event->state & GDK_SHIFT_MASK)
strcat(temp, "SHIFT+");
if(event->state & GDK_META_MASK)
strcat(temp, "ALT+");
if(event->state & GDK_LOCK_MASK)
strcat(temp, "LOCK+");
strcat(temp, gdk_keyval_name(event->keyval));
gtk_label_set_text (GTK_LABEL(label), temp);
g_print("%s, ",temp); // 在終端打印鍵值
g_print("%s value 0x%x/n", gdk_keyval_name(event->keyval), event->keyval);
gtk_entry_set_text(GTK_ENTRY(widget), "");
return FALSE;
}
int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *hbox;
GtkWidget *label;
GtkWidget *button;
GtkWidget *entry;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
// gtk_window_set_default_size(GTK_WINDOW(window), 300, 300);
hbox = gtk_hbox_new(FALSE, 10);
gtk_container_set_border_width(GTK_CONTAINER(hbox), 10);
gtk_container_add (GTK_CONTAINER(window), hbox);
label = gtk_label_new ("please press any key");
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 10);
entry = gtk_entry_new();
gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 10);
button = gtk_button_new_with_label ("close");
gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 10);
gtk_widget_show_all(window);
g_signal_connect(button, "clicked", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
/*傳遞“key-press-event”信號*/
g_signal_connect(entry, "key-press-event", G_CALLBACK(key_value), label);
gtk_main();
return 0;
}
結果如下:
/*點滴積累,我的一小步O(∩_∩)O~*/