Определить, какая клавиша нажата в C
Я пытаюсь найти способ выяснить, какая клавиша нажата в C. Это будет в графической среде, написанной на GTK2, но я не думаю, что ответ лежит там. Я думаю, что я мог бы сделать это с помощью Xlib, но я не смог найти ничего убедительного в этом.
У кого-нибудь есть предложения как это сделать?
Мне удалось поймать нажатие клавиши, используя следующий код:
GtkWidget *window;
void gtk_widget_set_events(window,GDK_KEY_RELEASE_MASK);
g_signal_connect(window,"key_release_event",G_CALLBACK(hello),NULL);
Тем не менее, я хотел бы определить, какая клавиша нажата. По ссылке, размещенной Адитьей Кумаром, я знаю, что ответ заключается в использовании GdkEventKey, поскольку это структура с полем keyval, но я не могу понять синтаксис правильно. Как правильно получить этот номер?
Это метод, который я попробовал:
static void hello( GtkWidget *widget,
guint data ){
g_print ("Hello World, %d was pressed\n",data);}
Я попытался предоставить "данные", выполнив это, когда поймал key_release_event:
g_signal_connect(window,"key_release_event",G_CALLBACK(hello),GdkEventKey.keyval);
Тем не менее, я получаю ошибку компилятора, например, так:
hello.c:85:5: error: expected ‘)’ before ‘.’ token
hello.c:85:5: error: expected expression before ‘,’ token
3 ответа
Вы правы с вашим оригинальным синтаксисом.
g_signal_connect(window, "key-release-event", G_CALLBACK(key_event), NULL);
Где функция key_event выглядит примерно так (заметьте, я использую gdk_keyval_name для преобразования значения keyval int в строку для печати):
static gboolean
key_event(GtkWidget *widget,
GdkEventKey *event)
{
g_printerr("%s\n",
gdk_keyval_name (event->keyval));
return FALSE;
}
Вот полный пример программы:
#include <gtk/gtk.h>
static gboolean
key_event(GtkWidget *widget,
GdkEventKey *event)
{
g_printerr("%s\n",
gdk_keyval_name (event->keyval));
return FALSE;
}
int main( int argc,
char *argv[] )
{
GtkWidget *window;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect(window, "key-release-event", G_CALLBACK(key_event), NULL);
gtk_widget_show (window);
gtk_main ();
return 0;
}
Глядя на справочное руководство по gdk, я думаю, что вы можете захватывать события клавиатуры, используя это, если только вы не хотите иметь программу "C".
Вот ссылка, чтобы помочь вам.
event->keyval - указатель на структуру, где keyval содержит целочисленное значение для нажатой клавиши, это было использовано выше в функции gdk_keyval_name (event->keyval), которая получает фактическое имя для клавиши.