GTK中如何捕捉和屏蔽按键信号(如F10等)

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~*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值