0

我正在编写一个 C 程序来控制 ARDrone,并且希望无人机只要按下一个键就可以移动,并且当不再按下该键时我希望它停止移动。我将 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

您可以尝试以下方法

void gtk_widget_add_events(GtkWidget* widget, gint event_mask);

event_mask应该在哪里GDK_KEY_RELEASE_MASK | GDK_KEY_PRESS_MASK 并且您还应该触发事件处理程序key-release-event

要获得更详细的答案,需要更多代码和输出信息。

于 2012-07-14T08:19:21.403 回答
0

如果有人想知道,我发现了问题。在我的函数中,当用户按下相应的键时,keyboard_update()我调用的是按下按钮。g_signal_emit_by_name(G_OBJECT(/*button*/), "activate", NULL)一旦我删除了这个功能,密钥释放事件就会再次被识别。不知道为什么会发生这种情况,但我现在可以不用这个功能。

于 2012-07-25T22:28:26.327 回答