将键盘事件注入 FLTK 时遇到问题

Posted

技术标签:

【中文标题】将键盘事件注入 FLTK 时遇到问题【英文标题】:Having trouble injecting keyboard events to FLTK 【发布时间】:2014-03-06 21:30:08 【问题描述】:

我有一个没有键盘的系统。我可以连接键盘,但最终输入来自不是 HID 设备的自定义键盘,它发送串行数据,我可以解释和解码以确定用户是否按下了向上、向下、向左、向右或 Enter。

现在我只有一个 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)

那不编译,告诉我它“不能在没有对象的情况下调用成员函数 virtual int Fl_Window::handle(int)”

我认为“int 事件”实际上应该是 FL_KEYDOWN。

这种逻辑让我想知道我是如何“设置” event_key() 的。例如,当一个人有一个处理程序时,有一些 API 函数可以得到它,但我不希望得到它;我希望让那个事件发生。

我唯一的选择是弄清楚如何模拟 HID 或制作某种类型的虚拟 HID,然后我会在其中导致键盘事件发生吗?

我觉得我的应用程序中不需要处理函数,我对发生的默认行为并导致我的回调函数被调用感到满意。我的问题是我不能“导致”这些事件发生。

【问题讨论】:

查看seriss.com/people/erco/fltk/#KeyPressRelease中的“演示键盘按下/释放” 抱歉:我在 FLTK1 和 FLTK2 之间切换。发送是 FLTK2 的东西。在 FLTK1 上,发送是静态的。解决它的一种方法是获取 fltk 源并取消静态。另一种方法是设置 Fl::e_keysym 然后调用处理程序。如果您需要示例,请告诉我 - 您使用的是 Linux 还是 Windows? 当然有一个很好的例子,我会试试这个建议。我正在使用 Linux。有FLTK2吗?也许我会切换到那个。现在检查一下,我对那个的主要愿望是它是否可以直接用于帧缓冲区。 我通过设置 e_keysym 让它工作了。感谢您的帮助! 有一个 FLTK2 和一个 FLTK3。几乎没有人使用 FLTK2 - 如果您使用它,您就只能靠自己了。我还没有尝试过 FLTK3。如果您需要 FLTK 方面的帮助,最好继续 FLTK1。 【参考方案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);

【讨论】:

以上是关于将键盘事件注入 FLTK 时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

编译 FLTK 程序时的问题

如何将 FLTK 库添加到 netbeans 项目中

如何在 MinGW 中使用 FLTK 1.1 dll?

使用 FLTK 框架编译的问题

在 Visual Studio 2010 上安装 FLTK

设置 Xcode 和 FLTK