2010-10-06 1 views
4

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

ответ

3

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

This post may be of interest to you.