2010-01-27 2 views
3

Я пытаюсь отслеживать видимые окна из всех текущих запущенных процессов. Моя программа взаимодействует с этими окнами, и чем быстрее она сможет их обнаружить, тем лучше. Моя цель - перемещать видимые окна в определенное место на экране, прежде чем они даже нарисуют позицию по умолчанию, если это возможно. Если нет, я хочу переместить их как можно быстрее после их создания.Как выполнить некоторый код каждый раз, когда открывается окно приложения (другие процессы)?

Прямо сейчас я перечисляю окна Visble с помощью EnumWindows (p/invoked из user32.dll) в цикле с малой задержкой между итерациями, как я могу обосновать.

Я ищу метод, чтобы подключить «что-то», что позволит мне дождаться события «открытия окна», чтобы стрелять, а не постоянно опроса.

Есть ли способы достижения этого?

ответ

5

Вам нужна функция API SetWindowsHookEx(), устанавливающая крюк WH_SHELL. Обратный вызов получает уведомление HSHELL_WINDOWCREATED, когда создается новое окно верхнего уровня.

Это глобальный крючок, вы не можете написать код для этого крюка на C#. Для этого требуется DLL, которая может быть введена в процесс, CLR не может быть правильно инициализирован для поддержки управляемого кода. Вам понадобится неуправляемая DLL, чтобы выполнить задание, this project предлагает один.