Определить, какая клавиша нажата в 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

person Sinthet    schedule 13.08.2011    source источник
comment
Это консольное приложение, работающее в XTerm? Или X-приложение - тем самым используя что-то вроде Motif?, GNome...?   -  person Ed Heal    schedule 13.08.2011
comment
Я предполагаю, что ваш ответ похоронен где-то в обработке событий GTK2.   -  person pmr    schedule 13.08.2011
comment
скопируйте свой hello.c на кодовую панель или ideone и дайте ссылку.   -  person A. K.    schedule 14.08.2011


Ответы (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;
}
person Mark    schedule 14.08.2011
comment
Большой! Этот код работает так, как ожидалось. Не могли бы вы объяснить синтаксис этой строки? gdk_keyval_name (событие-›keyval)); Я запутался в (event-›keyval)); особенно. - person Sinthet; 15.08.2011
comment
@Sinthet, переменная события является указателем на GdkEventKey (разработчика .gnome.org/gdk/stable/). Он имеет элемент keyval: беззнаковое целое число, соответствующее нажатой клавише. Это сопоставление определено в gdkkeysyms.h (git.gnome.org/browse /gtk+/plain/gdk/gdkkeysyms.h) - person Mark; 15.08.2011
comment
Ладно, думаю, я понимаю, как все сходится. Большое спасибо за ваше сообщение! - person Sinthet; 15.08.2011

глядя на справочное руководство gdk, я думаю, что вы можете записывать события клавиатуры, используя это, если вы специально не хотите иметь программу «C».

Вот ссылка, чтобы помочь вам.

http://www.gtk.org/api/2.6/gdk/gdk-Keyboard-Handling.html

person A. K.    schedule 13.08.2011
comment
Хорошо, это кажется правильным, но как я могу на самом деле получить keyval? Поскольку это структура, я попытался сделать что-то вроде keyval=GdkEventKey.keyval, но это не сработало. - person Sinthet; 13.08.2011
comment
пожалуйста, напишите, что вы пробовали, отредактировав исходный пост. также отпишитесь о том, что не получилось - person A. K.; 13.08.2011
comment
Я разместил то, что я пробовал, усеченный до соответствующих частей. Я попробовал пару вариантов, но я не могу понять это правильно. - person Sinthet; 14.08.2011

event->keyval — это указатель на структуру, где keyval содержит целочисленное значение для нажатой клавиши, это использовалось выше в функции gdk_keyval_name (event->keyval), которая получает фактическое имя для клавиши.

person martin    schedule 08.10.2016