Здесь есть пара основных проблем.Прежде всего, вы не звоните CloseHandle
с дескриптором окна.Это не такая ручка.Вы используете CloseHandle
, когда у вас есть HANDLE
, но HWND
не является HANDLE
.Если вы хотите уничтожить дескриптор окна, вам нужно вызвать DestroyWindow
.
Однако документация для DestroyWindow
гласит:
Поток не можетиспользуйте DestroyWindow, чтобы уничтожить окно, созданное другим потоком.
Так что вы также не можете сделать это.
Что вы можете сделать, это отправить сообщение WM_CLOSE
наокно.Этого должно быть достаточно, чтобы убедительно закрыть его.
Обратите внимание, что WM_CLOSE
отправлено, а не отправлено.Это можно определить по этой строке из документации :
Окно получает это сообщение через функцию WindowProc.
Update
Джон Кноллер отмечает, что я неправильно истолковываю документацию по Windows, которая не была написана для освещения ситуации, когда одно приложение пытается закрыть другое приложение.
Совет Джона:
На самом деле разумнее отправить WM_CLOSE
другому процессу, используя PostMessage
или SendNotifyMessage
.Если вы используете SendMessage
, вы застрянете, если процесс не качает сообщения.Еще лучше использовать WM_SYSCOMMAND
/ SCCLOSE
, что по сути аналогично нажатию кнопки закрытия заголовка окна.