Я поддерживаю приложение WxWidgets C++, которое использует EVT_CHAR_HOOK для захвата ключевых событий в окне высокого уровня. Я не могу найти никакой реальной документации для этого события, но могу предположить, что он перехватывает ключевые события каким-то образом, который имеет приоритет над «стандартными» ключевыми событиями. Одна из неприятных вещей, которые я только что обнаружил, заключается в том, что если этот крюк установлен, любые клавиши ускорителя, которые могли быть определены, больше не будут запускать свои события, даже если обработчик события вызывает Skip() в событии. Я также видел некоторые сообщения при поиске в google, которые, казалось, предполагали, что EVT_CHAR_HOOK может не поддерживаться на всех платформах. Это правда, и я должен его использовать?Что делает wxWidgets '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, в противном случае события будут посланы к детям. Если вы хотите поймать такие вещи, как escape, вам нужно установить флаг wxWANTS_CHARS в фрейм. Кроме того, убедитесь, что вы вызываете event.Skip() для символов, которые вы не обрабатываете.
Но другой пост гласит:
... не используют EVT_CHAR_HOOK(), это хак. Более того, это взломанный Windows-файл и . Я лично совсем не заинтересован в том, чтобы он работал правильно. Если что-нибудь, Я бы хотел отказаться от него и полностью избавиться от него. VZ.