wxWidgets的EVT_CHAR_HOOK有什么作用?

时间:2010-10-06 21:16:06

标签: c++ wxwidgets

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

1 个答案:

答案 0 :(得分:4)

我刚看了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邮件列表帖子之一:

  

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

但另一篇文章指出:

  

...不要使用EVT_CHAR_HOOK(),这是一个黑客攻击。此外,它是一个Windows特定的黑客和   我个人并不感兴趣让它正常工作。如果有什么,   我想弃用它并完全摆脱它。 VZ。

This post may be of interest to you