C语言 Long key press GTK



不久前,我遇到了长时间按键的问题。我正在开发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 %dn", 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},但会有一些延迟。 那么,密钥发布事件是正常行为吗?如果没有,请告诉我如何解决它。

这是因为我在VirtualBox下运行我的程序。如果该程序作为主机系统在 Windows 上启动,则该程序可以正常工作。

您是否通过键入test.exe并按回车键来运行程序? 如果是这样,则可能在程序已运行后注册返回密钥释放。

您可以通过运行程序来测试这一点,但按住键直到程序出现在屏幕上,然后松开并查看它是否注册了状态更改。

另一种方法是在key_event_cb内部打印event->hardware_keycode,然后按几个键,看看是否可以看到按键的哪个键码与鬼键匹配。

如果您发现是您的返回键造成了麻烦,快速解决方法可能是:

static gboolean 
key_event_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
{
if (event->keyval != GDK_KEY_Return) {
printf("Key released %dn", release_count);
++release_count;
}
return FALSE;
}

最新更新