长按GTK

时间:2018-06-26 10:54:24

标签: c linux windows gtk cross-platform

不久前,我在长时间按下按键时遇到问题。我正在开发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}的消息,但会有些延迟。 那么,键释放事件是否正常?如果没有,请告诉我如何解决。

2 个答案:

答案 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;
}