Зарегистрируйтесь в окне сообщений, используя «hwnd» - PullRequest
2 голосов
/ 19 июня 2011

Предполагая, что у меня есть действующее hWnd для активного окна (например, оно было получено с помощью «GetForegroundWindow» или FindWindow), могу ли я зарегистрироваться в сообщении windows этого hWnd, конечно же, из другого приложения? Есть ли для этого Win32 API или встроенный метод C #?

Пример: в моем консольном приложении у меня есть окно в блокноте (работает в фоновом режиме). Могу ли я каким-либо образом зарегистрироваться в сообщениях, указывающих, что окно «Блокнота» было перемещено, изменилось в размерах, свернуто, закрыто и т. Д.?

Спасибо

Elad

Ответы [ 2 ]

2 голосов
/ 20 июня 2011

Если вам просто нужно узнать о его перемещении или закрытии, посмотрите SetWinEventHook .Для этого вам нужно написать оболочку P / Invoke, поскольку в .Net API нет эквивалента.Вы можете использовать это без необходимости вставлять DLL (используйте флаг WINEVENT_OUTOFCONTEXT), поэтому можете хранить все в C # (и это также избавляет от необходимости устанавливать связь между отдельной DLL и вашим основным процессом).

Скорее всего, вам понадобятся события EVENT_OBJECT_LOCATIONCHANGE и EVENT_OBJECT_DESTROY.Обратите внимание, что вы получаете их для всех HWND в потоке, который вы слушаете, поэтому вам нужно будет фильтровать по HWND в вашем обратном вызове.

Обратите внимание, что при использовании WINEVENT_OUTOFCONTEXT ваш собственный код должен иметьЦикл сообщений работает в потоке, который вызывает SetWinEventHook.Кроме того, полученные вами уведомления доставляются не мгновенно , а с небольшой задержкой (аналогично PostMessage), но это все же может быть достаточно быстрым для ваших целей, чтобы вы могли избежать ловушки в процессе.

Вы можете использовать приложение Accessible Event Watcher (AccEvent), которое является частью Windows SDK, чтобы увидеть, какие сообщения доступны из блокнота, прежде чем вы начнете писать код.

2 голосов
/ 19 июня 2011

Вы должны внедрить DLL в процесс, которому принадлежит окно. Используйте функцию SetWindowsHookEx (), WH_CALLWNDPROC. Вы не можете написать такую ​​DLL, используя язык C #, процесс не будет инициализирован CLR и готов к запуску вашего кода. Родной код не требуется. Отметьте этот проект .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...