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