检测C中按下了哪个键

Sin*_*het 3 c gtk gtk2

我正试图找到一种方法来找出在C中按下哪个键.这将是在用GTK2编写的图形环境中,但我不认为答案就在那里.我想我可以使用Xlib做到这一点,但我还没有找到任何结论.

有没有人对如何做到这一点有任何建议?

我已设法使用以下代码捕获按键:

GtkWidget *window;
void gtk_widget_set_events(window,GDK_KEY_RELEASE_MASK);
g_signal_connect(window,"key_release_event",G_CALLBACK(hello),NULL);
Run Code Online (Sandbox Code Playgroud)

但是,我想确定按下了哪个键.从Aditya Kumar发布的链接中,我知道答案在于使用GdkEventKey,因为它是一个具有keyval字段的结构,但我似乎无法使语法正确.获得此号码的正确方法是什么?

这是我尝试过的一种方法:

static void hello( GtkWidget *widget,
               guint   data ){

g_print ("Hello World, %d was pressed\n",data);}
Run Code Online (Sandbox Code Playgroud)

当我捕获key_release_event时,我尝试通过执行此操作来提供"数据":

g_signal_connect(window,"key_release_event",G_CALLBACK(hello),GdkEventKey.keyval);
Run Code Online (Sandbox Code Playgroud)

但是,我得到一个编译器错误,如下所示:

hello.c:85:5: error: expected ‘)’ before ‘.’ token 
hello.c:85:5: error: expected expression before ‘,’ token
Run Code Online (Sandbox Code Playgroud)

Mar*_*ark 8

您的原始语法是正确的.

g_signal_connect(window, "key-release-event", G_CALLBACK(key_event), NULL);
Run Code Online (Sandbox Code Playgroud)

key_event函数看起来像(注意我使用gdk_keyval_name将keyval int值转换为字符串进行打印):

static gboolean
key_event(GtkWidget *widget,
          GdkEventKey *event)
{
    g_printerr("%s\n",
               gdk_keyval_name (event->keyval));
    return FALSE;
}
Run Code Online (Sandbox Code Playgroud)

这是一个完整的示例程序:

#include <gtk/gtk.h>

static gboolean
key_event(GtkWidget *widget,
          GdkEventKey *event)
{
    g_printerr("%s\n",
               gdk_keyval_name (event->keyval));
    return FALSE;
}

int main( int   argc,
          char *argv[] )
{

    GtkWidget *window;

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    g_signal_connect(window, "key-release-event", G_CALLBACK(key_event), NULL);

    gtk_widget_show (window);

    gtk_main ();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • @Sinthet,事件变量是指向GdkEventKey(http://developer.gnome.org/gdk/stable/gdk-Event-Structures.html#GdkEventKey)结构的指针.它有一个成员keyval:一个unsigned int,对应于被按下的键.此映射在gdkkeysyms.h中定义(http://git.gnome.org/browse/gtk+/plain/gdk/gdkkeysyms.h) (2认同)