3

我试图找到一种方法来找出在 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);

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

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

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

g_print ("Hello World, %d was pressed\n",data);}

当我捕捉到 key_release_event 时,我尝试通过这样做来提供“数据”:

g_signal_connect(window,"key_release_event",G_CALLBACK(hello),GdkEventKey.keyval);

但是,我收到如下编译器错误:

hello.c:85:5: error: expected ‘)’ before ‘.’ token 
hello.c:85:5: error: expected expression before ‘,’ token
4

3 回答 3

9

您的原始语法是正确的。

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

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;
}

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

#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;
}
于 2011-08-14T14:30:50.373 回答
1

在查看 gdk 参考手册时,我认为您可以使用它来捕获键盘事件,除非您特别想要一个“C”程序。

这是帮助您的链接。

http://www.gtk.org/api/2.6/gdk/gdk-Keyboard-Handling.html

于 2011-08-13T01:01:22.297 回答
0

event->keyval 是一个指向结构的指针,其中 keyval 包含按下的键的整数值,这已在上面的函数 gdk_keyval_name (event->keyval) 中使用,该函数获取键的实际名称。

于 2016-10-08T21:20:27.097 回答