Программирование на Visual C++. Архив рассылки
Шрифт:
Рассмотрим еще раз прототип функции обработчика
В качестве id передается значение которое мы указали при регистрации обработчика. Это может пригодиться если мы захотим реализовать обработку нескольких событий в одной функции. Для этого нужно зарегистрировать одну и ту же функцию с разными DISPID, тогда по приходу событий мы сможет их различать.
pVarResult нужно, если не требуется обработки по умолчанию. При этом достаточно в pVarResult вернуть VARIANT_FALSE.
Итак, когда вызывается наш обработчик никакой дополнительной информации о событии в функцию не передается. А как же тогда поподробнее узнать, что произошло? Для этого необходимо воспользоваться интерфейсом IHTMLEventObj, доступным через объект window текущего документа. Посредством этого интерфейса можно получить подробную информацию о произошедшем
Вот его краткое описание из MSDN:
Методы IHTMLEventObj
get_altKey | Состояние клавиши Alt |
get_button | Возвращает информацию о нажатых кнопках мыши |
get_cancelBubble | Возвращает будет ли продолжена обработка события вверх по иерархии обработчиков |
get_clientX | Возвращает горизонтальную позицию курсора мыши относительно клиентской области окна |
get_clientY | Возвращает вертикальную позицию курсора мыши относительно клиентской области окна |
get_ctrlKey | Состояние клавиши Ctrl |
get_fromElement | Возвращает указатель на интерфейс IHTMLElement позволяющий получить доступ к элементу с которого "ушел" курсор мыши при событиях onmouseover или onmouseout. |
get_keyCode | Возвращает код нажатой клавиши |
get_offsetX | Возвращает горизонтальную позицию курсора относительно контейнера элемента |
get_offsetY | Возвращает позицию курсора относительно контейнера элемента |
get_qualifier | Возвращает идентификатор события |
get_reason | Возвращает состояние передачи данных для объекта источника данных |
get_returnValue | Возвращаемое значение события или диалога |
get_screenX | Горизонтальная координата относительно координат экрана |
get_screenY | Вертикальная координата относительно координат экрана |
get_shiftKey | Состояние клавиши Shift |
get_srcElement | Возвращает указатель на интерфейс IHTMLElement послуживший источником событий |
get_srcFilter | Возвращает объект фильтр возбудивший событие onfilterchange |
get_toElement | Возвращает указатель на интерфейс IHTMLElement позволяющий получить доступ к элементу с на который "пришел" курсор мыши при событиях onmouseover или onmouseout |
get_type | Возвращает строковое название события |
get_x | Возвращает горизонтальную позицию мыши относительно родительского объекта в иерархии, позиционированного с помощью атрибутов CSS |
get_y | Возвращает вертикальную позицию мыши относительно родительского объекта в иерархии, позиционированного с помощью атрибутов CSS |
put_cancelBubble | Задать будет ли продолжена обработка события вверх по иерархии обработчиков |
put_keyCode | Задать код нажатой клавиши |
put_returnValue | Задать возвращаемое событием значение |
Стоит заметить, что интерфейс IHTMLEventObj доступен только на время обработки конкретного события. При этом не все свойства в контексте определенного события имеют смысл.
В следующем примере в обработчике обределяется нажатая клавиша и выводится соответствующее диалоговое окно. Если была нажата клавиша Enter, то дальнейшая обработка отменяется.
Чтобы собрать воедино все фрагменты приведу небольшой пример (event.zip). Запустите его и выберите команду меню Event\OnKeydown. Теперь понажимайте клавиши внутри страницы. И посмотрите, что из этого получится. В этом примере регистрируется только один обработчик, но я думаю дочитав эту статью вы без труда сможете реализовать любой другой.
В заключение хочется заметить, что в этой статье я затронул только один небольшой аспект использования элемента WebBrowser. Если Вас заинтересует данная тема, пишите, продолжим.
ВОПРОС – ОТВЕТ
Как получить список запущенных приложений?
Автор: Александр Федотов
Тестовое приложение Process Viewer – pview.zip (130 Kb)
Операционная система Windows знаменита своими окнами. Поэтому, когда заходит речь о приложениях, пользователи ассоциируют их с окнами, хотя с технической точки зрения правильнее было бы оперировать понятием процесса. В частности, под списком приложений пользователи часто подразумевают не список процессов, а список главных окон приложений, видимых на экране. В таком случае, задача перечисления приложений сводится к перечислению их главных окон.
Для перечисления всех окон верхнего уровня служит функция EnumWindows, однако, если мы просто вызовем эту функцию, то обнаружим, что она возвращает много больше окон, чем видно приложений на экране. Очевидно, мы должны игнорировать невидимые окна и окна, имеющие владельца (такие как диалоговые панели). Но даже и после этой фильтрации в списке будет несколько больше окон, чем отображает Task Manager.
Проведя несколько экспериментов с Windows NT Task Manager, удалось установить, что он игнорирует окна с пустым заголовком, и, как ни странно, окна с заголовком "Program Manager". Да-да, если вы создатите свое окно с таким заголовком, то оно не появится в списке приложений Task Manager. Обычно в системе есть только одно окно "Program Manager" – это то окно, на котором находится рабочий стол. Понятно, что пользователи не ассоциируют это окно с каким-либо приложением, для них оно является неотъемлемой частью компьютера, и поэтому Task Manager должен игнорировать это окно. Непонятно только, почему разработчики Task Manager решили определять это окно по его заголовку, а не по имени класса окна, которое есть "progman".