簡體   English   中英

檢測 C 中按下了哪個鍵

[英]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”程序。

這是幫助您的鏈接。

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

event->keyval 是一個指向結構的指針,其中 keyval 包含按下的鍵的 integer 值,這已在上面的 function gdk_keyval_name (event->keyval) 中使用,它獲取鍵的實際名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM