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 によって投稿されたリンクから、keyval フィールドを持つ構造であるため、答えは GdkEventKey を使用することにあることがわかりますが、構文を正しく取得できないようです。この番号を取得する正しい方法は何ですか?

これは私が試した方法です:

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 は、キーの実際の名前を取得する関数 gdk_keyval_name (event->keyval) で使用されている構造体へのポインタです。keyval には、押されたキーの整数値が含まれます。

于 2016-10-08T21:20:27.097 に答える