2014-01-07 3 views
1

Я спрашиваю, как говорится в названии. Является ли это возможным?Замените WndProc другой функцией обработки сообщений?

Поскольку MSG уже содержит все, что мне нужно для самодельного обработчика событий, я подумал, может быть, я смогу его создать. Я прошу об этом, главным образом, избавиться от интерпретируемого кастинга, поэтому я могу использовать внутренние функции и классы внутри моего класса окон для повышения производительности. Я также хочу знать, можно ли просто получить MSG в одиночку и делать с ним все, что я хочу.

В принципе, есть другой способ получить сообщение окна, а затем обработать его, не похожее на общие петли, найденные в этом thread?

EDIT: В настоящее время я использую функцию GetMessage(), чтобы получить структуру MSG и использовать ее в своем обработчике событий, однако я не получаю все сообщения, которые я хочу с этим. Есть ли что-нибудь еще, что я должен делать?

Благодарим вас за продвижение.

+0

Это звучит например, вы ищете более модульный, возможно объектно-ориентированный способ программирования Windows. Вы можете использовать .NET, если вы хотите пойти с «управляемым» C++ ... если вы не хотите иметь дело с .NET. есть [MFC] (http://msdn.microsoft.com/en-us/library/d06h2x6e.aspx) и [wxWidgets] (http://www.wxwidgets.org/), среди прочих. – David

+0

MFC и .NET все еще используют цикл сообщений в своем ядре, просто отвлекаясь от вас на интерфейс событий, чтобы вы его не видели. Цикл сообщений в значительной степени является способом обработки оконных сообщений, хотя, как я сказал , вы можете абстрагировать его до красивого дизайна событий – bizzehdee

+0

@ David: На самом деле это была моя первая идея, но с использованием C++ и более низкого уровня winapi дает мне лучшую производительность, что является главным приоритетом. – kir

ответ

4

В настоящее время я использую функцию GetMessage(), чтобы получить структуры MSG

, который является проблемой, GetMessage() только получает сообщения, которые были размещены в очереди сообщений. Он не обнаруживает сообщения, отправленные с помощью SendMessage(). Который обходит очередь сообщений и вызывает процедуру окна напрямую.

Вы поэтому необходимо использовать WndProc, чтобы увидеть все сообщения для окна.

Подмножество отправленных сообщений, которые входят в очередь и, таким образом, возвращаются GetMessage(), является небольшим. Вкратце, входные уведомления для мыши и клавиатуры и сообщения с низким приоритетом (WM_PAINT, WM_TIMER, WM_QUIT). WM_ACTIVATE всегда отправляется.

Замена WndProc окна, конечно, обычная техника, это называется "sub-classing the window". Любой C++ библиотека классов обертка использует его для отображения сообщений методам C++. Лучше всего, чтобы не изобретать что колесо.