Сабклассинг

Сабклассинг - техника, которую программисты могут использовать для перехвата сообщений Windows. Для этого необходимо заменить VB процедуру обработки сообщений окна своей собственной.

Каждый раз, когда пользователь делает что-нибудь, к примеру, двигает мышью, Windows посылает сообщение вашей форме. Visual Basic нормально обрабатывает все сообщения и для некоторых из них создаёт события. К примеру, событие Click возникает, когда Visual Basic получает сообщение от Windows, что пользователь нажал кнопку мыши на форме.

Проблема в том, что Visual Basic не создаёт события для всех посылаемых сообщений и мы остаёмся без очень многих важных для нас событий. Например, когда пользователь изменяет размер формы, VB создаёт событие. Но событие возникает только после того, как пользователь завершает изменять её размер (отпускает кнопку мыши).

Используя сабклассинг, вы можете перехватить сообщение об изменении размера, и, перед тем, как пользователь закончит изменять размер, вы можете ограничить его действия. Этот принцип применим ко многим сообщениям.

Сабклассинг, как вам уже известно, стало возможным использовать с появлением в Visual Basic 5 ключевого слова AddressOf. Прежде разработчикам приходилось использовать для этого дополнительный элемент управления.

Ключевое слово AddressOf, которое встречается в коде всего несколько раз для реализации сабклассинга, возвращает адрес процедуры. Возможно это было бы бессмысленным, если бы мы не использовали его для получения адреса нашей процедуры обработки сообщений Windows.

Как только мы заполучили адрес нашей процедуры, мы можем использовать API-функцию SetWindowLong, чтобы перенаправить сообщения Windows нашей процедуре, вместо стандартной, имеющейся в VB.

Теперь нам остаётся только обрабатывать эти сообщения. Простая процедура приёма сообщений имеет следующие аргументы.:

hWnd - хэндл окна типа Long (обычно это форма, сообщения к которой вы хотите перехватывать;
uMsg - сообщение Windows;
wParam - дополнительная информация о сообщении;
lParam - дополнительная информация о сообщении.

В процедуре необходимо воспользоваться оператором Select Case, чтобы проверить, какое сообщение было послано, где после каждого слова Case указывается обработка конкретного сообщения. Теоретически вы можете обрабатывать таким образом все посылаемые сообщения, но это будет замедлять работу системы в целом и можно привести к полному "зависанию". Вместо этого мы обрабатываем только необходимые нам сообщения, а остальные пересылаем для обработки стандартной процедуре VB.

Когда вы выходите из своей программы, позаботьтесь о том, чтобы вернуть управление обратно VB. Сначала, перед тем как перенаправить сообщения Windows вы должны сохранить адрес стандартной процедуры обработки (хэндл вашей формы). Если вы не вернёте управления VB, это может привести к некорректному завершению вашей программы или, возможно даже, к "зависанию" системы. Многие используют Windows NT для разработки своих приложений, т.к. она более устойчива и только VB (IDE) или ваша программа, а не операционная система, в этом случае завершаться некорректно.

Сэм Хаггил (Sam Huggill).

Статьи