![](/img/trans.png)
[英]How to detect that arrow key is pressed using C under Linux or Solaris?
[英]Detect which key is pressed in C
我試圖找到一種方法來找出在 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
您的原始語法是正確的。
g_signal_connect(window, "key-release-event", G_CALLBACK(key_event), NULL);
key_event function 看起來像(注意我使用 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;
}
在查看 gdk 參考手冊時,我認為您可以使用它來捕獲鍵盤事件,除非您特別想要一個“C”程序。
這是幫助您的鏈接。
event->keyval 是一個指向結構的指針,其中 keyval 包含按下的鍵的 integer 值,這已在上面的 function gdk_keyval_name (event->keyval) 中使用,它獲取鍵的實際名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.