Что делает EVT_CHAR_HOOK wxWidgets? - PullRequest
4 голосов
/ 07 октября 2010

Я поддерживаю приложение wxWidgets C ++, которое использует EVT_CHAR_HOOK для захвата ключевых событий в окне высокого уровня.Я не могу найти никакой реальной документации для этого события, но могу предположить, что он каким-то образом перехватывает ключевые события, которые имеют приоритет над «стандартными» ключевыми событиями.Одна тревожная вещь, которую я только что обнаружил, заключается в том, что, если этот хук установлен, любые клавиши ускорения, которые могли быть определены, больше не будут запускать свои события, даже если обработчик события вызывает Skip () для события.Я также видел некоторые сообщения при поиске в Google, которые, как представляется, подсказывают, что EVT_CHAR_HOOK может поддерживаться не на всех платформах.Это правда, и я должен использовать это?

1 Ответ

4 голосов
/ 03 ноября 2010

Я только что посмотрел на 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.

Это сообщение может вас заинтересовать .

...