2011-08-13 37 views
3

我試圖找到一種方法來找出哪個鍵按下向下C.這將是在圖形環境中,寫在GTK2哪個鍵按下,但我不認爲答案在於那裏。我想我可以使用Xlib來做到這一點,但我一直無法找到任何結論。檢測用C

有沒有人有任何建議如何做到這一點?

我已經成功使用的後續代碼搭上按鍵:

GtkWidget *window; 
void gtk_widget_set_events(window,GDK_KEY_RELEASE_MASK); 
g_signal_connect(window,"key_release_event",G_CALLBACK(hello),NULL); 

不過,我想,以確定哪個鍵按下。從發表阿迪蒂亞·庫馬爾的聯繫,我知道答案就在於使用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 
+1

我想你的答案是什麼地方埋在GTK2事件處理。 – pmr

+0

這是一個在XTerm中運行的控制檯應用程序嗎?或者一個X應用程序 - 從而使用Motif ?, GNome ...之類的東西? –

+0

在鍵盤或ideone上覆制粘貼你的hello.c並給出鏈接。 –

回答

7

你與你的原始語法正確。

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

太棒了!此代碼按預期工作。你能解釋這條線的語法嗎? gdk_keyval_name(event-> keyval));我很困惑(event-> keyval));尤其是。 – Sinthet

+2

@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) – Mark

+0

好吧,我想我明白一切都是如此。非常感謝您的帖子! – Sinthet

1

雖然看着gdk參考手冊,我認爲你可以捕獲鍵盤事件除非你特別想要一個'C'程序,否則使用它。

這裏是來幫助你的鏈接。

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

+0

好吧,這似乎是正確的,但我怎麼能真正得到keyval?由於它的結構,我嘗試做keyval = GdkEventKey.keyval,但這不起作用。 – Sinthet

+0

請通過編輯您的原始帖子發佈您的評論。還發布什麼沒有工作 –

+0

我已經發布了我試過的,截斷到相關部分。我嘗試了幾個變種,但我似乎無法正確地得到它。 – Sinthet

0

事件 - > KEYVAL是一個指向一個結構,其中KEYVAL包含按下的鍵一整數值,這已經在上面的函數gdk_keyval_name使用(事件 - > KEYVAL)它獲取一個動作密鑰的名稱。