我正试图找到一种方法来找出在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
答案 0 :(得分:8)
您的原始语法是正确的。
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;
}
答案 1 :(得分:1)
在查看gdk参考手册时,我认为您可以使用此方法捕获键盘事件,除非您特别想要“C”程序。
这是帮助你的链接。
答案 2 :(得分:0)
event-&gt; keyval是指向结构的指针,其中keyval包含按下的键的整数值,这在上面的函数gdk_keyval_name(event-&gt; keyval)中使用,该函数获取键的实际名称