Что нового

Завершение работы Приложения (не Процесса!)

Victor_Man

Новичок
Сообщения
3
Репутация
0
Доброго времени суток!

Есть приложение, которое при завершении (Файл->Выход) закрывает свое окно но остается в памяти в виде процесса.
Конкретно речь идет о Hex Workshop

Выглядит это так:

1. Запускаем приложение HWorks32.exe и в диспетчере задач видим:
Приложение - Hex Workshop
Процесс - HWorks32.exe

2. Выходим из приложения и в диспетчере задач видим:
Приложения - нет (!)
Процесс - HWorks32.exe - остается в памяти!!!

Есть желание прибить этот процесс (это не проблема), но как обнаружить такую ситуацию?
Наверное, можно смотреть в AutoIT открытое окно, если оно закрывается - то убивать процесс...???
Но что-то окна не закрываются...вроде...?
Может кто подсказать решение?
 
A

Alofa

Гость
Victor_Man сказал(а):
... Запускаем приложение HWorks32.exe и в диспетчере задач видим:
Приложение - Hex Workshop
Процесс - HWorks32.exe
Victor_Man есть такое понятие как процессы и есть понятие - окно процесса (т.е. процесс создает свое окно). Процессы могут запускать дочерние процессы, у которых тоже могут быть окна. Сами же окна могут находиться в одном из нескольких состояний (смотрите описание функции "WinGetState()").
Так вот, вкладка "Приложение", в штатном диспетчере задач, отображает текущее окно того или иного процесса.
Вот поэкспериментируйте:
Код:
$hWnd = WinWait('[CLASS:HexWorksClass]')
WinSetState($hWnd, '', @SW_HIDE)
MsgBox(4096, '', 'Окно скрыто. После закрытия этого окна будет восстановлено.')
WinSetState($hWnd, '', @SW_SHOW)

А после, ответьте на вопрос: Как такое могло приключиться?
Victor_Man сказал(а):
... Выходим из приложения и в диспетчере задач видим:
Приложения - нет (!)
Процесс - HWorks32.exe - остается в памяти!!!
 
Автор
V

Victor_Man

Новичок
Сообщения
3
Репутация
0
Alofa сказал(а):
Поэкспериментируйте...

Спасибо!

Получилось так:

Код:
Run("HWorks32.exe")
WinWait('[CLASS:HexWorksClass]')

Do
$iState = WinGetState("[CLASS:HexWorksClass]", "")
Until BitAND($iState, 2) <> 2
ProcessClose ( "HWorks32.exe" )
ProcessClose ( "HWorks32.exe" )

Два раза ProcessClose, т.к. запускается дочерний процесс...
Может, еще придется разбираться с двумя процессами - но главное решено.
 
A

Alofa

Гость
Victor_Man запустите скрипт и в диспетчере задач посмотрите загрузку ЦП, при открытом окне Hex Workshop.
 
Автор
V

Victor_Man

Новичок
Сообщения
3
Репутация
0
Alofa сказал(а):
Victor_Man запустите скрипт и в диспетчере задач посмотрите загрузку ЦП, при открытом окне Hex Workshop.
Ой, про это я забыл...пока пытался сделать аналогичное решение на .CMD.
Спасибо! Так окончательно:
Код:
Run("HWorks32.exe")
WinWait('[CLASS:HexWorksClass]')

Do
$iState = WinGetState("[CLASS:HexWorksClass]", "")
Sleep (500)
Until BitAND($iState, 2) <> 2
ProcessClose ( "HWorks32.exe" )
ProcessClose ( "HWorks32.exe" )
 
A

Alofa

Гость
:whistle:
Код:
Local $hWnd, $sProcess = 'HWorks32.exe'

Run(@ScriptDir & '\' & $sProcess)
$hWnd = WinWaitActive('[CLASS:HexWorksClass]')

While Sleep(250)
	$iState = WinGetState($hWnd)
	If Not BitAND($iState, 2) Then ExitLoop
WEnd

$aProcList = ProcessList($sProcess)
If Not @error And UBound($aProcList) > 1 Then
	For $i = 1 To $aProcList[0][0]
		ProcessClose($aProcList[$i][1])
	Next
EndIf
 
Верх