2014-03-06 5 views
2

У меня есть система без клавиатуры. Я могу подключить клавиатуру, но в конечном итоге входы поступают с пользовательской клавиатуры, которая не является устройством HID, она отправляет последовательные данные, которые я могу интерпретировать и декодировать, чтобы определить, нажата ли кнопка «Вверх», «Вниз», «Влево», «Вправо» или «Ввод».Ошибка при вводе событий клавиатуры в FLTK

Сейчас у меня есть Fl_Window с двумя виджетами Fl_Button. Фокус установлен для одной из кнопок, и для этих кнопок определены обратные вызовы. Я знаю, что если я присоединяю настоящую клавиатуру и использую клавиши со стрелками, я могу сменить фокус с кнопки на кнопку. Мне нужно нажать SPACE, чтобы активировать кнопку.

Моя проблема заключается в определении того, как вызвать эти нажатия клавиш, используя код, когда я декодирую результат из встроенной клавиатуры. Потому что в развертывании не будет реальной клавиатуры.

То, что я пробовал, заключается в том, чтобы вызывать int Fl_Window :: handle (int) и не имел успеха. Я также пытался вызвать int Fl :: handle (int, Fl_Window *) и не имел успеха.

Вот примеры кода:

if((ret = Fl::handle(FL_Left, window)) == 0) 

Это компилирует, но я считаю, что я получаю нулевой обратно, это означает, что он не обработал событие.

if((ret = Fl_Window::handle(FL_Right)) == 0) 

Это не компилируется, сообщив мне, что он «не может вызвать функцию член виртуального Int Fl_Window :: Handle (INT) без объекта»

Я имею в виду, что «ИНТ событие» на самом деле должен FL_KEYDOWN.

Эта логика оставляет мне удивление, хотя я «задал» event_key(). Например, есть функции API, чтобы получить это, когда у вас есть обработчик, но я не хочу этого делать; Я хочу, чтобы это событие произошло.

Является ли мой единственный вариант здесь, чтобы выяснить, как эмулировать HID или сделать какой-то виртуальный HID, где я тогда буду вызывать события клавиатуры?

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

+1

Посмотрите на «Продемонстрировать клавиатуры нажатие/отпускание» в http://seriss.com/people/erco/fltk/#KeyPressRelease – cup

+0

Вы можете вызвать события, связанные с использованием send. – cup

+0

Спасибо за цитирование примера, я думаю, что он показывает, как писать пользовательский обработчик, я не думаю, что мне это нужно, мне просто нужно знать, как вызвать события. Я вижу следующий комментарий о send(); и в документации FLTK указано, что она является предпочтительной оболочкой для handle(). Хорошо, пытаясь использовать это, я не могу найти синтаксис и примеры. Я не могу его скомпилировать, если объявить его как Fl_Widget :: send(), Fl_Window :: send() или Fl :: send(). – RTM

ответ

1

Вам необходимо назначить нужный ключ e_keysym, а затем отправить событие FL_KEYDOWN, используя Fl::handle_(). (Fl::handle() не будет генерировать Followup FL_SHORTCUT событие.)

Fl::e_keysym = FL_Left; 
Fl::handle_(FL_KEYDOWN, window); 
// sleep() and/or Fl::wait() as appropriate 
Fl::handle_(FL_KEYUP, window); 
Смежные вопросы