Почему WM_CLOSE / DESTROY только частично закрывает окно моего блокнота? - PullRequest
0 голосов
/ 26 июня 2018

Мой сценарий заключается в том, что программа вызывает мою 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 ...)

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Попробуйте сделать это:

SendMessage (hWnd, WM_SYSCOMMAND, SC_CLOSE, 0);  // or PostMessage perhaps better

Это то, что Windows отправляет, когда вы нажимаете на поле «Закрыть», и с гораздо большей вероятностью будет работать в более широком диапазоне приложений, так как приложение тогда будет считать, что оно имеетбыл закрыт пользователем и должен действовать соответственно.

0 голосов
/ 26 июня 2018

Я использую [CloseWindow], чтобы попытаться закрыть окно.

CloseWindow не закрывает окно - оно минимизирует его.

Вместо этого отправьте окну сообщение WM_CLOSE:

SendMessage(h, WM_CLOSE, 0, 0);
...