不久前,我在长时间按下按键时遇到问题。我正在开发GTK应用程序,并具有一些基于按键和释放键的逻辑。我知道如何处理,但按字母按钮会出现意外行为。当仍然按下一个键时,会触发一个键释放事件,并且仅在Windows中发生。使用Linux(Kubuntu和Arch Linux(KDE))不会发生这种情况。是该错误还是我应该考虑应用程序逻辑的行为?
代码在这里
#include <gtk/gtk.h>
int release_count = 0;
static gboolean
key_event_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
{
printf("Key released %d\n", release_count);
++release_count;
return FALSE;
}
static void
activate(GtkApplication* app, gpointer user_data)
{
GtkWidget *window;
window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window), "Window");
gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
gtk_widget_add_events(window, GDK_KEY_RELEASE_MASK | GDK_KEY_PRESS_MASK);
g_signal_connect(
window, "key-release-event", G_CALLBACK(key_event_cb), NULL
); //keyboard events
gtk_widget_show_all(window);
}
int
main(int argc, char **argv)
{
GtkApplication *app;
int status;
app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);
g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
status = g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return status;
}
如果启动代码并按h
,则会出现类似key pressed {counter}
的消息,但会有些延迟。
那么,键释放事件是否正常?如果没有,请告诉我如何解决。
答案 0 :(得分:1)
发生这种情况是由于我在VirtualBox下运行了程序。如果该程序在Windows上作为主机系统启动,则该程序可以正常运行。
答案 1 :(得分:0)
您是否通过键入test.exe
并按 return 来运行程序?
如果是这样,一旦程序已经运行,它可能正在注册 return 密钥释放。
您可以通过运行程序来进行测试,但是按住键直到程序出现在屏幕上,然后释放并查看它是否记录了状态更改。
另一种方法是在event->hardware_keycode
内打印key_event_cb
,然后按几个键,看看是否可以看到按键的哪个键码与幻影键匹配。
如果您发现它是导致您讨厌的 return 键,则快速修复方法可能是:
static gboolean
key_event_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
{
if (event->keyval != GDK_KEY_Return) {
printf("Key released %d\n", release_count);
++release_count;
}
return FALSE;
}