Что нового

[Процессы] Слежение за процессом

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
madmasles,
Раз на раз не приходится. У меня на WinXPx32 серевнуются IsHWnd и WinExists. И показывает что побеждает WinExists.
(правда с изменениями в скрипте)
Код:
For $i = 1 To $iCount
    Sleep(1000)
    $iTimer = TimerInit()
    For $j = 1 To 100
		$iRes = ProcessExists($iPid)
	Next
    $aResult[0][$i] = Round(TimerDiff($iTimer), 3)
    ConsoleWrite('ProcessExists: ' & $aResult[0][$i] & @TAB & $iRes & @LF)

    Sleep(1000)
    $iTimer = TimerInit()
	For $j = 1 To 100
		$hWin = WinGetHandle('[Title:' & $sTitle & ';Class:AutoIt v3]')
	Next
    $aResult[1][$i] = Round(TimerDiff($iTimer), 3)
    ConsoleWrite('WinGetHandle: ' & $aResult[1][$i] & @TAB & $hWin & @LF)

    Sleep(1000)
    $iTimer = TimerInit()
	For $j = 1 To 100
		$aRes = DllCall('user32.dll', 'hwnd', 'FindWindowW', 'wstr', 'AutoIt v3', 'wstr', $sTitle)
	Next
    $aResult[2][$i] = Round(TimerDiff($iTimer), 3)
    ConsoleWrite('FindWindowW: ' & $aResult[2][$i] & @TAB & $aRes[0] & @LF)

    Sleep(1000)
    $iTimer = TimerInit()
	For $j = 1 To 100
		$iRes = WinExists($hWnd)
	Next
    $aResult[3][$i] = Round(TimerDiff($iTimer), 3)
    ConsoleWrite('WinExists: ' & $aResult[3][$i] & @TAB & $iRes & @LF)

    Sleep(1000)
    $iTimer = TimerInit()
	For $j = 1 To 100
		$aRes = DllCall('user32.dll', 'int', 'IsWindow', 'hwnd', $hWnd)
	Next
    $aResult[4][$i] = Round(TimerDiff($iTimer), 3)
    ConsoleWrite('IsWindow: ' & $aResult[4][$i] & @TAB & $aRes[0] & @LF)

    Sleep(1000)
    $iTimer = TimerInit()
	For $j = 1 To 100
		$iRes = IsHWnd($hWnd)
	Next
    $aResult[5][$i] = Round(TimerDiff($iTimer), 3)
    ConsoleWrite('IsHWnd: ' & $aResult[5][$i] & @TAB & $iRes & @LF)

    Sleep(1000)
    $iTimer = TimerInit()
	For $j = 1 To 100
		$aRes = DllCall('kernel32.dll', 'int', 'GetExitCodeProcess', 'ptr', $hProc, 'dword*', 0)
	Next
    $aResult[6][$i] = Round(TimerDiff($iTimer), 3)
    ConsoleWrite('GetExitCodeProcess: ' & $aResult[6][$i] & @TAB & $aRes[2] & @LF)
    ConsoleWrite('---' & @LF)
Next
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
joiner
Если у процесса есть окно, то можно установить хук, который будет извещать ваш скрипт о том, что создано или закрыто какое то окно. Останется лишь отсетить все не нужные окна. Так можно узнать, что приложения закрылось не используя в цикле проверки на ishwnd итп. Смотрите пример к функции _WinAPI_RegisterShellHookWindow
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
процесс, который следит, не имеет окна. у первого процесса есть окно, но не факт (не обязательно) . в обычном режиме для одновременного прекращения работы скриптов я использую передачу данных между ними. один дает команду другому и оба закрываются.
но есть момент, когда первый скрипт может быть завершен через диспетчер задач или другой программой (принудительная выгрузка)
при этом, как я понял, все равно система регистрирует код выхода. вот функция GetExitCodeProcess позволяет отловить этот момент и завершить слежение + работу.
по паре тестов заметил, что вызов этой функции в цикле не тормозит основную работу. но пара тестов это почти ничего. (жду выходные)
пока буду тестировать в разных вариантах. тем более в теме появились еще варианты. за что очень благодарен
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
inververs [?]
можно установить хук
Хорошая идея.
Вариант использования.
Код:
HotKeySet('{ESC}', '_Exit')

Global $sFile = 'Test_Script.exe', $iPid, $hWnd, $hGui, $sTitle, $aRes

$sTitle = StringLeft($sFile, StringInStr($sFile, '.', 0, -1) - 1)
$iPid = Run(@ScriptDir & '\' & $sFile)
If Not $iPid Then Exit 1
$hWnd = WinWait('[Title:' & $sTitle & ';Class:AutoIt v3]', '', 3)
If Not $hWnd Then Exit 2
$aRes = DllCall('user32.dll', 'uint', 'RegisterWindowMessageW', 'wstr', 'SHELLHOOK')
If (@error) Or (Not $aRes[0]) Then Exit 3
If Not GUIRegisterMsg($aRes[0], '_ShellHook') Then Exit 4
$hGui = GUICreate('')
$aRes = DllCall('user32.dll', 'int', 'RegisterShellHookWindow', 'hwnd', $hGui)
If (@error) Or (Not $aRes[0]) Then Exit 5
While 1
	Sleep(1000)
WEnd

Func _Exit()
	ConsoleWrite('Exit' & @LF)
	DllCall('user32.dll', 'int', 'DeregisterShellHookWindow', 'hwnd', $hGui)
	GUIDelete($hGui)
	Exit
EndFunc   ;==>_Exit

Func _ShellHook($h_Wnd, $i_Msg, $i_wParam, $h_lParam)
	Switch $h_lParam
		Case $hWnd
			Switch $i_wParam
				Case 2;$HSHELL_WINDOWDESTROYED = 2
					_Exit()
			EndSwitch
	EndSwitch
EndFunc   ;==>_ShellHook
Дублирую скрипт Test_Script (его надо скомпилировать).
Код:
#NoTrayIcon
AutoItWinSetTitle(StringLeft(@ScriptName, StringInStr(@ScriptName, '.', 0, -1) - 1))
MsgBox(64, 'Info', 'Test_Script')
Exit 66


Добавлено:
Сообщение автоматически объединено:

joiner [?]
процесс, который следит, не имеет окна. у первого процесса есть окно, но не факт (не обязательно)
Во всех моих вариантах (которые с окнами работают) отслеживается скрытое окно AutoIt.
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
madmasles
а если не использовать в первом коде
Код:
$hGui = GUICreate('')

можно ли будет установить хук?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
joiner,
У меня не получилось. А чем оно мешает?
 
Верх