Если вам просто нужно узнать о его перемещении или закрытии, посмотрите 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, чтобы увидеть, какие сообщения доступны из блокнота, прежде чем вы начнете писать код.