wxWidgets的EVT_CHAR_HOOK是做什么用的?

4
我正在维护一个使用EVT_CHAR_HOOK捕获高级窗口中按键事件的wxWidgets C++应用程序。我无法找到真正的文档来解释这个事件,但我可以推测它以某种方式拦截了具有优先级的“标准”按键事件。最令人不安的是,如果此钩子已经设置,即使事件处理程序在事件上调用Skip(),任何可能已定义的加速键也将不再触发它们的事件。当我在谷歌上搜索时,我还看到一些帖子似乎表明EVT_CHAR_HOOK可能不受所有平台支持。这是真的吗?我应该使用它吗?
1个回答

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 );
        }

那么,也许您只需要从OnCharHook事件处理程序中返回false

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

如果您希望框架捕获所有字符事件,请使用EVT_CHAR_HOOK,否则事件将发送到子级。如果您想捕获诸如escape之类的内容,则需要在框架上设置wxWANTS_CHARS标志。另外,请确保您在不处理的字符上调用event.Skip()。

但是另一个帖子指出:

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

这篇文章可能会对您有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接