【发布时间】:2024-06-19 03:05:02
【问题描述】:
我们正在尝试使用 glade 过滤 C 中的按键事件中的键。但是我们不知道如何过滤这些键。代码如下:
// called when key pressed
void on_window_main_key_press_event()
{
}
【问题讨论】:
我们正在尝试使用 glade 过滤 C 中的按键事件中的键。但是我们不知道如何过滤这些键。代码如下:
// called when key pressed
void on_window_main_key_press_event()
{
}
【问题讨论】:
您必须使用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;
}
【讨论】:
按键的回调函数是
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
【讨论】:
我认为这应该对你有所帮助
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);
【讨论】: