Однажды,я пожаловался в этой теме, что немогу понять основ сабклассинга. Ответ был дан, размытый конечно, но в общем понятный. Вооружившись поисковиками и словарями, я принялся за поиски и нашёл множество различной информации. Что из этого получилось, я хочу привести здесь и получить комментарии и исправления, если я что-то неправильно понял.
Windows – операционная система, основанная на сообщения и событиях. Это означает, что каждое действие вызывает событие, передающееся в виде сообщения в приложение. Приложение анализирует сообщение и выполняет соответствующее действие.
В операционной системе, пользователь может работать одновременно с несколькими приложениями. Например, может редактировать текст в текстовом редакторе, и переключится в программу обработки электронных таблиц, выполнить расчёты. Поэтому ни одно приложение не может функционировать само по себе, не взаимодействуя с другими приложениями и операционной системой. Вышестоящее приложение или операционная система, должны сообщить, что происходит и только тогда, приложение реагирует.
Предположим, в операционной системе выполняются два приложения. Ни одно из них, не может перехватить инициативу и среагировать на нажатие клавиш клавиатуры, потому что это событие может быть предназначено другому приложению. Поэтому Windows сначала воспринимает событие, вызванное нажатием клавиш, а затем решает, кому передать обработку этого события. Затем нажатие клавиш в виде сообщений посылается приложению. Приложение обрабатывает события, связанные с клавиатурой.
Разумеется, такое представление является упрощённым. Обычно, при обработке нажатия клавиш, вызывается значительно больше сообщений и событий.
Кроме сообщений связывающих пользователя с приложениями операционной системы, существуют и внутренние сообщения Windows. Они служат для обновления времени и даты, для сообщения изменений о состоянии или исчерпании системных ресурсов.
Технология сабклассинга и хука, основана на сообщениях, которыми обменивается операционная система. С их помощью, можно управлять, изменять или удалять сообщения, посланные приложениям операционной системы, тем самым изменив их реакцию. Поэтому, полное понимание сообщений операционной системы (Windows Message) – является основополагающим при изучении методов сабклассинга и хука.
Не стоит забывать, что пользоваться сабклассингом и хуком надо осторожно. Не правильное применение этих методов может вызвать, как падение приложения, так и всей операционной системы в целом.
Сабклассинг (Subclssing)
Технология сабклассинга, основана на перехвате сообщений операционной системы, для одного или нескольких окон или элементов управления. Перехваченное сообщение, можно ставить в исходном состоянии или изменить. Позже, сообщение может быть отправлено предназначенному для него окну или отброшено.
Перехватывая сообщения, мы получаем гибкий инструмент для управления окнами и элементами управления операционной системы. Например, щелкнув правой кнопкой мыши в элементе управления Visual Basic – TextBox, мы увидим контекстное меню элемента управления, выводимое по умолчанию.
Замена контекстного меню TextBox, собственным меню – является одним из простейших примеров применения сабклассинга. Но у сабклассинга, существует и множество других применений:Определение активности или неактивности окна и изменение его состояния.
Реагирование на добавленные в системное меню окна новые пункты.
Запрет на действия пользователя на манипуляции с окном.
Разрешения на изменение пользователем размеров окна, в пределах указанных параметров.
Изменение вида окна или элемента управления.
Изменение размеров списка элемента управления ComboBox.
Изменение или блокирование сообщений передаваемых окну или элементу управления.
Мониторинг за системными ресурсами операционной системы.
Изменение стандартного вида окна или элемента управления.
Сабклассинг открывает многообразие возможностей разработчику на Visual Basic – возможности, которые обычно недоступны или труднореализуемы. Существует три типа сабклассинга, которые мы будем обсуждать.
Первый: сабклассинг экземпляра – позволяет перехватить сообщение для единственного экземпляра окна или элемента управления. Этот вид сабклассинга наиболее используемый, он, например, позволяет определить размеры экземпляра окна.
Второй: глобальный сабклассинг – позволяет перехватывать сообщения для одного или более окон или элементов управления. Все окна, происходят из одного типа класса, эти классы описывают фундаментальный вид и поведение окон, производных от них. Например, стандартная кнопка, каждый экземпляр этого элемента управления – производная от класса BUTTON. Используя глобальный сабклассинг, мы можем изменить поведение целого класса. Это позволяет перехватывать сообщения для всех окон или элементов управления, производных из этого класса. Используя глобальный сабклассинг можно управлять возможностью изменить любое окно или элемент управления, производный от класса.
Третий: суперклассинг – является аналогом глобального сабклассинга. У суперклассинга, также есть возможность перехвата сообщений для одного или более окон или элементов управления. Различие – при суперклассинге, создаётся абсолютно новый класс.
Хук (Hook)
Технология хука, подобно сабклассингу основана на перехвате сообщений операционной системы, но в более широком смысле. Хук позволяет перехватить сообщение, как до обработки его окном, так и после.
Есть несколько видов хука, каждый предназначен для определённой цели:WH_CALLWNDPROC
WH_CALLWNDPROCRET
WH_CBT
WH_DEBUG
WH_FOREGROUNDIDLE
WH_GETMESSAGE
WH_JOURNALPLAYBACK
WH_JOURNALRECORD
WH_KEYBOARD
WH_KEYBOARD_LL
WH_MOUSE
WH_MОUSE_LL
WH_MSGFILTER
WH_SYSMSGFILTER
WH_SHELL
У хука, в отличие от сабклассинга, областью действия может быть одно приложение или область контекстов устройств, общее для нескольких приложений. Этим подразумевается – хук может перехватить сообщение для одного приложения, или общее сообщение для нескольких приложений работающих в операционной системе. Хук, даёт контроль над операционной системой, невозможный получить при помощи сабклассинга.
Вот несколько примеров использования хука:Изменение сообщения, отправленного диалоговым окнам, полосам прокрутки, меню.
Сабклассинг окна, находящегося в отдельном процессе.
Перехват и изменение сообщений мыши или клавиатуры на уровне системы.
Установка горячей клавиши справки, для пунктов меню.
Создание утилиты, подобной Spy++.
Создание автоматизированного приложения тестирования.
Определение состояния приложение – активно или неактивно.
Изменение кнопок мыши и нажатий клавиш для определенного приложения, или для всех приложений.
Изменение функциональности сочетания клавиш ALT+TAB и ALT+ESC.
С уважением...