0

ARDrone を制御するための C プログラムを作成しています。キーを押している間はドローンを動かし、キーが押されなくなったら動きを止めたいと考えています。作成したウィンドウに key_press_event と key_release_event の両方を追加しました。コールバック関数は次のとおりです。

gint key_press_cb(GtkWidget *widget, 
                GdkEventKey *kevent, 
                gpointer data)
{ 
unsigned int key;
int res;

/* While a key is pressed the drone moves,
 * when the key is released it is put back into hover mode */
if(kevent->type == GDK_KEY_RELEASE) {
    // Hover mode
    printf("--- Hover Mode ---\n");
    ardrone_at_set_progress_cmd(0, 0, 0, 0, 0);
    //res = keyboard_update(BACKSPACE);
} else if(kevent->type == GDK_KEY_PRESS) {

    key = kevent->keyval;
    g_message("Key pressed: %c [%d]", key, key);

    res = keyboard_update(key); 
}

return TRUE;
}

キーを短時間押し続けるとキー リリース イベントが発生しますが、2 秒以上押し続けるとキー リリース イベントが表示されません。キーを押しながら key_press_events を常に受信しているためだと考えていました。その繰り返しを無効にする方法はありますか?

4

2 に答える 2

0

誰かが疑問に思っていたら、私は問題を見つけました。私の関数では、ユーザーが対応するキーを押したときにボタンを押すようkeyboard_update()に呼び出していました。g_signal_emit_by_name(G_OBJECT(/*button*/), "activate", NULL)この機能を削除すると、キーリリースイベントが再び認識されていました。なぜこれが起こるのかわかりませんが、私は今のところこの機能なしで生きることができます。

于 2012-07-25T22:28:26.327 に答える
0

以下を試すことができます

void gtk_widget_add_events(GtkWidget* widget, gint event_mask);

また、イベントハンドラーをトリガーする必要がevent_maskありますGDK_KEY_RELEASE_MASK | GDK_KEY_PRESS_MASKkey-release-event

より詳細な回答を得るには、より多くのコードと出力情報が必要です。

于 2012-07-14T08:19:21.403 に答える