2014-03-06 30 views
2

我有一个没有键盘的系统。我可以连接键盘,但最终输入来自不是HID设备的自定义键盘,它会发送串行数据,我可以解释和解码以确定用户是按下上,下,左,右,还是输入。在向FLTK注入键盘事件时遇到困难

现在我所有的是一个Fl_Window,有两个Fl_Button小部件。焦点设置为其中一个按钮,并为这些按钮定义回调。我知道,如果我附上一个真正的键盘,并使用箭头键,我可以将焦点从按钮更改为按钮。我不得不打空间来激活一个按钮。

我的问题是,当我解码嵌入式键盘的输出时,如何使用代码来确定如何导致这些按键按下。因为在部署中,不会有实际的键盘。

我试过的是调用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 ::手柄(INT)无对象”

我想的是,“INT事件”,其实应该FL_KEYDOWN。

这个逻辑让我想知道如何“设置”event_key()。例如,有一个API函数可以在有一个处理程序的时候得到这个函数,但我不希望那样做;我希望引起这个事件发生。

在这里,我唯一的选择是如何模拟HID或制作某种类型的虚拟HID,然后导致键盘事件发生?

我不觉得我需要一个处理函数在我的应用程序中,我很好的默认行为发生并导致我的回调函数被调用。我的问题是我不能“引起”这些事件发生。

+1

有在http://seriss.com/people/erco/fltk/#KeyPressRelease – cup

+0

看看“论证键盘按/放”你可以使事件通过使用发送发生。 – cup

+0

感谢您举例说明,我认为它展示了如何编写自定义处理程序,我不相信我需要这个,我只需要知道如何导致事件发生。我看到关于send()的下一条评论;并且FLTK文档指出它是handle()的首选包装器。好的,在尝试使用时,我无法完全找到语法,也没有任何示例。如果我将其声明为Fl_Widget :: send(),Fl_Window :: send()或Fl :: send(),我就无法编译它。 – RTM

回答

1

您需要将所需的密钥分配给e_keysym,然后使用Fl::handle_()分派FL_KEYDOWN事件。 (Fl::handle()不会产生后续FL_SHORTCUT事件。)

Fl::e_keysym = FL_Left; 
Fl::handle_(FL_KEYDOWN, window); 
// sleep() and/or Fl::wait() as appropriate 
Fl::handle_(FL_KEYUP, window);