wxWidgets的EVT_CHAR_HOOK有什么作用?

2024-03-20

我正在维护一个 wxWidgets C++ 应用程序,它使用 EVT_CHAR_HOOK 来捕获高级窗口中的关键事件。我找不到此事件的任何真实文档,但我可以推测它以某种优先于“标准”关键事件的方式拦截关键事件。我刚刚发现的一件令人不安的事情是,如果这个挂钩到位,任何可能已定义的加速键将不再触发其事件,即使事件处理程序在事件上调用 Skip() 也是如此。我在谷歌搜索时也看到了一些帖子,似乎表明并非所有平台都支持 EVT_CHAR_HOOK。这是真的吗?我应该使用它吗?


我刚刚调查了src/gtk/window.cpp并找到了这篇文章:

        // Implement OnCharHook by checking ancestor top level windows
        wxWindow *parent = win;
        while (parent && !parent->IsTopLevel())
            parent = parent->GetParent();
        if (parent)
        {
            event.SetEventType( wxEVT_CHAR_HOOK );
            ret = parent->HandleWindowEvent( event );
        }

        if (!ret)
        {
            event.SetEventType(wxEVT_CHAR);
            ret = win->HandleWindowEvent( event );
        }

所以,也许你只需要返回false从你的OnCharHook事件处理程序?

根据 wx 邮件列表帖子之一:

如果您希望框架捕获所有字符事件,请使用 EVT_CHAR_HOOK,否则事件将发送给子级。如果你想捕获像逃逸这样的东西,你需要在框架上设置 wxWANTS_CHARS 标志。另外,请确保对不处理的字符调用 event.Skip() 。

但另一篇文章指出:

...不要使用 EVT_CHAR_HOOK(),它是一种 hack。此外,它是一个特定于 Windows 的 hack 我个人对让它正常工作一点也不感兴趣。如果有什么, 我想弃用它并完全摆脱它。 VZ。

.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

wxWidgets的EVT_CHAR_HOOK有什么作用? 的相关文章

随机推荐