我正在维护一个使用EVT_CHAR_HOOK捕获高级窗口中按键事件的wxWidgets C++应用程序。我无法找到真正的文档来解释这个事件,但我可以推测它以某种方式拦截了具有优先级的“标准”按键事件。最令人不安的是,如果此钩子已经设置,即使事件处理程序在事件上调用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 );
}
那么,也许您只需要从OnCharHook
事件处理程序中返回false
?
根据wx邮件列表帖子之一:
如果您希望框架捕获所有字符事件,请使用EVT_CHAR_HOOK,否则事件将发送到子级。如果您想捕获诸如escape之类的内容,则需要在框架上设置wxWANTS_CHARS标志。另外,请确保您在不处理的字符上调用event.Skip()。
但是另一个帖子指出:
...不要使用EVT_CHAR_HOOK(),它是一个hack。此外,它是一个特定于Windows的hack,我个人完全不感兴趣让它正常工作。如果有什么的话, 我想弃用它并完全摆脱它。VZ。