1

Тема: АНК: Закрыть незакрываемое окно

Как закрыть окно, не реагирующее на WinClose, WinKill и PostMessage,0x10?
Убивать родительский процесс - не выход, т.к. процесс помимо этого окна хостит и полезные окна.
Скрывать окно - не подходит, т.к. оно будет оставаться в системе (сейчас я его скрываю, но мне бы хотелось от этого уйти).

Пример такого окна - после завершения сессии в бесплатной версии TeamViewer на той машине, к которой подключались вылезает окно с WinTitle "Спонсируемый сеанс ahk_class #32770 ahk_exe TeamViewer.exe".

У этого окна используются нестандартные стили (style 0x94C000CE и exstyle 0x00010109), которые я пробовал приводить к стандартному виду (к 0x14CF0000 и 0x00000100, как у окон проводника), появляется в заголовке кнопка закрытия окна, но клик по ней ничего не делает.

Alt+F4 также не закрывает окно.

Окно, по задумке разработчиков программы закрывается при клике по одной из кнопок внутри окна (кнопка "ОК") и окно можно закрыть используя ControlClick или ControlSend для эмуляции клика по этой кнопке, но этот вариант - очень частный, а хочется более универсального решения (в принципе, разработчиком же ничто не мешало скрыть эту кнопку или вовсе не создавать в окне никаких кнопок) по закрытию окна.

Один человек в IRC заявил, что у него это окно удалось закрыть командой PostMessage,0x10, но у меня этот вариант не сработал, а PostMessage,0x12 закрывает все окна (а процесс после этого умирает).

2

Re: АНК: Закрыть незакрываемое окно

Drugoy пишет:

PostMessage,0x10
PostMessage,0x12

Знать бы ещё, что это за магические числа.
WM_DESTROY можно попробовать.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: АНК: Закрыть незакрываемое окно

Да, здесь актуально было бы сослаться на MessageList: http://script-coding.com/AutoHotkey/MessageList.html

WM_CLOSE = 0x10
WM_QUIT = 0x12

Попробовал WM_DESTROY - не помогло.

4

Re: АНК: Закрыть незакрываемое окно

Ну ещё DestroyWindow function. Хотя скорее всего, все подобные сообщения просто перехватываются. В этом случае закрыть не получится никак без завершения процесса, можно только скрыть.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: АНК: Закрыть незакрываемое окно

Достаточно закрыть поток, создавший окно, по идее, если приложение многопоточное. Конечно, вопрос, к чему это приведёт в смысле функционала программы.

6

Re: АНК: Закрыть незакрываемое окно

Тогда так можно наудачу попробовать:

F10::
   ThreadID := DllCall("GetWindowThreadProcessId", Ptr, WinExist("A"), Ptr, 0)
   hThread := DllCall("OpenThread", UInt, THREAD_TERMINATE := 1, UInt, 0, UInt, ThreadID, Ptr)
   DllCall("TerminateThread", Ptr, hThread, UInt, 0)
   DllCall("CloseHandle", Ptr, hThread)
   Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: АНК: Закрыть незакрываемое окно

teadrinker пишет:

Тогда так можно наудачу попробовать:

F10::
   ThreadID := DllCall("GetWindowThreadProcessId", Ptr, WinExist("A"), Ptr, 0)
   hThread := DllCall("OpenThread", UInt, THREAD_TERMINATE := 1, UInt, 0, UInt, ThreadID, Ptr)
   DllCall("TerminateThread", Ptr, hThread, UInt, 0)
   DllCall("CloseHandle", Ptr, hThread)
   Return

убило вообще все окна тимвьюера, но процессы продолжили жить.

8

Re: АНК: Закрыть незакрываемое окно

Ну, всё равно, даже если бы и сработало, это не был бы универсальный вариант.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: АНК: Закрыть незакрываемое окно

Внедряться тогда в процесс и выполнять там свой код, подставив свой обработчик для сообщений окна. Опять же, думаю, не будет универсальности. Например, для инжекта DLL надо знать адрес функции LoadLibrary, но из-за ASLR он может быть другим в другом процессе. Может, его можно скорректировать, узнав адрес загрузки kernel32.dll в тот процесс. Если рандомизация не идёт ещё дальше.