Мой сценарий заключается в том, что программа вызывает мою DLL, и я использую Process.Start(notepad)
, чтобы запустить окно «Блокнот» в Windows 10 x64.Я не сохраняю идентификатор процесса запущенного процесса.Затем, через некоторое время, программа снова вызывает мою DLL, и я нахожу дескриптор окна Блокнота (сопоставляя строки заголовка).
Проблема заключается в том, что когда я использую этот дескриптор для отправки окну сообщения WM_CLOSE или DESTROY,работа не завершена.Окно исчезает с моего экрана.Он исчезает с панели задач.Но когда я смотрю на окна с помощью Alt-TAB, это так.Это на самом деле не прошло;это просто скрыто от панели задач.Я использую этот вызов Win32 API, чтобы попытаться закрыть окно.
[DllImport ("user32.dll", SetLastError = true)]
public static extern bool CloseWindow (IntPtr hWnd);
(1) Что я делаю не так?
(2) Мои ожидания не соответствуют?Могу ли я (как DLL, работающая под одним процессом) даже заказать закрытие Блокнота в другом процессе?
Полагаю, имея в руках ручку Блокнота, я мог вывести его на передний план и отправитьAlt + F4 к буферу клавиатуры, чтобы как-то подделать его, думая, что я набираю на нем символы.Но это похоже на долгий путь.
(3) Как программно сказать приложениям закрывать свои окна, не выводя их на передний план и не отправляя им нажатия клавиш, или не отправляя им щелчки мышью по кнопке закрытия X?
I 'Мы просматривали другие посты на форуме, но в основном они говорят о прекращении процесса с помощью API-процессов - грубый метод уничтожения, который на самом деле не то, что я хочу делать.(Кроме того, я хочу закрыть интересующее меня единственное окно, а не целый процесс, который может запускать дюжину разных окон, таких как MS Word ...)