【问题标题】:How do I Check for the Key Pressed in GTK3 (C)?如何检查 GTK3 (C) 中的按键?
【发布时间】:2024-06-19 03:05:02
【问题描述】:

我们正在尝试使用 glade 过滤 C 中的按键事件中的键。但是我们不知道如何过滤这些键。代码如下:

 // called when key pressed
void on_window_main_key_press_event()
{

}

【问题讨论】:

标签: c gtk3 glade


【解决方案1】:

您必须使用GdkEventKey 来处理按键事件。

结构如下所示:

struct GdkEventKey {
  GdkEventType type;  // is it a key-press or key release event
  GdkWindow *window; // the window receiving the event
  gint8 send_event;  // whether the event was sent explicitly. It's TRUE in that case
  guint32 time;    //time of event in ms
  guint state;     //a bit mask representing state of (Ctrl/Alt/Shift)
  guint keyval;   // the key that was pressed
  gint length;    // length of string
  gchar *string;   //the string that may result from this kepress
  guint16 hardware_keycode; //hardware key code
  guint8 group; // keyboard group
  guint is_modifier : 1;  //whether the key is mapped as modifier
};

您可以在此文件中找到所有按键的值:gdkkeysyms.h

这是一个简单的例子:

#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>

gboolean
on_window_main_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data);

int main (int argc, char *argv[])
{
  GtkWidget *window;

  gtk_init (&argc, &argv);

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

  g_signal_connect (G_OBJECT (window), "key_press_event", G_CALLBACK (on_window_main_key_press_event), NULL);

  gtk_widget_show_all (window);

  gtk_main ();

  return 0;
}

gboolean
on_key_press (GtkWidget *widget, GdkEventKey *event, gpointer user_data)
{
  switch (event->keyval)
  {
    case GDK_Z:
    case GDK_z:
      printf("key pressed: %s\n", "Z");
      break;
    case GDK_S
    case GDK_s:
      if (event->state & GDK_SHIFT_MASK)
      {
        printf("key pressed: %s\n", "shift + s");
      }
      else if (event->state & GDK_CONTROL_MASK)
      {
        printf("key pressed: %s\n", "ctrl + s");
      }
      else
      {
        printf("key pressed: %s\n", "s");
      }
      break;
    default:
      return FALSE; 
  }
  return FALSE; 
}

【讨论】:

    【解决方案2】:

    按键的回调函数是

    on_key_press(GtkWidget *widget, GdkEventKey *key, gpointer user_data)

    这里定义了 GdkEventKey 结构 (https://developer.gnome.org/gdk3/stable/gdk3-Event-Structures.html#GdkEventKey) keyval 返回按下的键的值,你可以像这样比较它。

    strcmp(gdk_keyval_name(key->keyval), "Return") == 0

    【讨论】:

    • 当您可以只比较整数值时,我不会使用键的字符串描述进行检查。
    【解决方案3】:

    我认为这应该对你有所帮助

    void on_window_main_key_press_event(GtkWidget *widget, GdkEventKey *key, gpointer user_data) {
        int TheKeyThatWasPressed = key->keyval; //Incase you need to find out what key got pressed
    }
    

    然后在你的主函数中使用它:

    g_signal_connect(Window, "key-press-event", G_CALLBACK(KeyPressHandler), NULL); 
    

    【讨论】: