我正在编写一个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;有没有办法禁用那个重复?
答案 0 :(得分:0)
您可以尝试以下
void gtk_widget_add_events(GtkWidget* widget, gint event_mask);
其中event_mask
应为GDK_KEY_RELEASE_MASK | GDK_KEY_PRESS_MASK
您还应该在key-release-event
要获得更详细的答案,需要更多代码和输出信息。
答案 1 :(得分:0)
如果有人在想,我发现了问题。在我的keyboard_update()
函数中,当用户按下相应的键时,我正在调用g_signal_emit_by_name(G_OBJECT(/*button*/), "activate", NULL)
按下按钮。删除此功能后,密钥发布事件再次被识别。不知道为什么会这样,但我现在可以没有这个功能。