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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-03 18:57:16

GTK中如何捕捉和屏蔽按键信号(如F10等)的相关文章

信号的屏蔽,信号集

1.信号集 POSIX标准定义了数据类型sigset_t #include <signal.h> int sigemptyset(sigset_t *set); 初始化一个信号集,使其不包括任何信号 int sigfillset(sigset_t *set); 用来初始化一个信号集,使其包括所有信号 int sigaddset(sigset_t *set, int signum); 用来向set指定的信号集中添加由signum指定的信号 int sigdelset(sigset_t *set,

GTK+重拾--07 GTK+中的事件

(一):写在前面 在这一个小节中,我们主要是学习GTK+2.0中最重要的部分,就是信号和事件.GTK+函数工具库是基于"事件"系统的.所有的GUI应用都是基于"事件"驱动的.如果没有"事件"发生,那么应用程序就无法正常运行.在GTK+中一个事件就是从X窗口服务器传过来的一个消息.当一个"事件"发生的时候,她就会通过发送一个"信号"来表示它已经做除了反应.当然,利用GTK+还可以为"信号"

GTK+中的树状列表构件(GtkTreeView)

GTK+中的树状列表构件(GtkTreeView) 在本章的GTK+程序设计教程中,我们将向大家重点介绍非常常用也有点复杂的构件--GtkTreeView . GtkTreeView?构件是一个高级的构件,利用他你就可以制作出漂亮的普通列表或者是树状的列表.这个构件里可以包含一或者多行.他的构架呢?正是采用了大名鼎鼎的MVC (Model View Controller) 设计框架.也就是说数据和显示方式是进行了一种分离的操作. 之前我们有说过复杂这个问题,于是在GtktreeView构件中确实

Gtk中的文本视图(GtkTexViewWidget)

Gtk中的文本视图(GtkTexView Widget) 在本章的Gtk+程序设计教程中,我们将重点介绍 GtkTexView 构件. GtkTexView?w构件被常常用来显示和编辑多行的文本.正如我们一再提到的,?GtkTexBuffer?构件也是给予MVC的设计.GtkTextView 就是显示(view)元素而 GtkTexBuffer 则代表了model 元素. GtkTexBuffer 常常被用来处理文本数据.GtkTextTag则是一种被用于文本的属性.?GtkTextIter则是

Hyper-V中 远程桌面无法捕获鼠标信号

当我们在Hyper-v中遇到鼠标不能正常使用,点击鼠标没反应的时候,在网络连接中也找不到网卡.点击鼠标时,虚拟机下方提示, "远程桌面无法捕获鼠标信号", 这是由于驱动问题导致的. 我们在虚拟机中插入集成服务安装盘,如下图, 手动运行光盘里的 support->x86 -> setup  重启客户机后,鼠标可以使用,网络连接也正常了. Hyper-V中 远程桌面无法捕获鼠标信号,布布扣,bubuko.com

GTK+重拾--10 GTK+中的组件(二)

(一):写在前面 在上面一个小节中,我们讲解了在GTK+2.0中的一些常用的构件,在这一小节中,我们将继续学习GTK+中常用的稍微复杂的构件,这里我们主要是学习GtkComboBox,GtkEntry,GtkIconView,GtkImage,GtkSeparator,GtkStatusBar.好了,现在我们开始我们的学习之旅. (二):GtkComboBox GtkComboBox构件的作用是让程序使用者根据不同的需求从很多选项中进行选择. 下面我们来看一下如何使用GTkComboBox. #

GTK+重拾--09 GTK+中的组件(一)

(一):写在前面 在这篇文章中主要介绍了GTK+程序中的各种构件,这是解说构件的第一个部分,另外一部分将在下一个小节中讲到. 构件是建立一个GUI程序的基础.在GTK+的长期发展过程中.一些特定的构件逐渐成为了大多数编程工具集和差点儿全部的操作系统的公用标准了.比如,按钮,选择框或者是一个滑动条. 对于GTK+来说,内置了非常多经常使用的专用构件,供我们使用. (二):GtkButton GtkButton是一个简单易用的构件,通常被用于触发一个动作. 以下我们来看一下GtkButton的用法:

GTK+中的构件II(Widgets)

GTK+中的构件II(Widgets) 在本章的GTK+程序设计中,我们仍然要继续向大家介绍和展示各种各样的构件. GtkComboBox GtkComboBox构件的作用是让程序使用者根据不同的需求从很多选项中进行选择. #include <gtk/gtk.h> void combo_selected(GtkWidget *widget, gpointer window) { gchar *text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(

Direcshow中视频捕捉和参数设置报告

Direcshow中视频捕捉和参数设置报告 1.      关于视频捕捉(About Video Capture in Dshow) 1视频捕捉Graph的构建 一个能够捕捉音频或者视频的graph图都称之为捕捉graph图.捕捉graph图比一般的文件回放graph图要复杂许多,dshow提供了一个Capture Graph Builder COM组件使得捕捉graph图的生成更加简单.Capture Graph Builder提供了一个ICaptureGraphBuilder2接口,这个接口