Что нового

Отлов процессов которые появились после запуска скрипта. И отслеживание их окон.

Anton

Твори! Пусть завистники твои захлебываются пылью!
Сообщения
69
Репутация
3
Нужно что бы скрипт отслеживал все процессы, которые появляются после его запуска, потом отлавливал все окна этих процессов. То есть возвращал какой-то массив где указанно имя(pid) процесса и идентификаторы всех его окон.

Два дня долбался с кодом, но получившийся бред так и не заработал.... :'(
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
WinList
Retrieves a list of windows.
Код:
WinList ( ["title" [, "text"]] )

Parameters
title[optional] The title of the window to read.
text[optional] The text of the window to read.
Return Value
Returns an array of matching window titles and handles.
Нэ?


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

Исходник скрипта который отлавливает все окна с названиеми "EVE - " и если они свернуты - разворачивает их.
http://autoit-script.ru/index.php?topic=1408.0
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#Include <GuiListView.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Win Checker", 194, 228, 386, 360)
$Group1 = GUICtrlCreateGroup("Списек окон", 0, 0, 193, 205)
$ListView1 = GUICtrlCreateListView("Win Name|Win State", 8, 16, 171, 175)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 100)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 67)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button1 = GUICtrlCreateButton("Старт!", 0, 206, 99, 21, $WS_GROUP)
$Input1 = GUICtrlCreateInput("15000", 100, 206, 93, 21)
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            $msg = 0
            GUICtrlSetData($Button1, "Стоп!")
                Do
                    $count = 0
                    $var = WinList()
                    For $i = 1 To $var[0][0]
                        If StringLeft($var[$i][0], 6) = "EVE - " Then
                            $count = $count+1
                            GUICtrlSetData($Group1, "Окон найдено:"&$count)
                            If WinGetState($var[$i][1]) = 23 Then 
                                WinSetState ( $var[$i][0], "", @SW_RESTORE )
                                GuiCtrlCreateListViewItem($var[$i][0]&"|Restored",$ListView1)
                            Else
                                GuiCtrlCreateListViewItem($var[$i][0]&"|Normal",$ListView1)
                            EndIf
                        EndIf
                        If GUIGetMsg() = $Button1 Then 
                            $msg = $Button1
                            ExitLoop
                        EndIf
                        
                    Next
                    If $count = 0 Then Exit
                    For $i = GUICtrlRead($Input1) to 0 step -1000
                        GUICtrlSetData($Group1, "Окон найдено: "&$count&" Обновление "&$i/1000& " с")
                        Sleep(1000)
                    Next
                    _GUICtrlListView_DeleteAllItems($ListView1)
                    
                Until $msg = $Button1
                $msg = 0
                GUICtrlSetData($Button1, "Старт!")
                GUICtrlSetData($Group1, "Списек окон")
    EndSwitch
WEnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Anton
У меня как-то так получилось:
Код:
#include <Array.au3>
#include <WinAPIEx.au3>

Global $aProcessOld = ProcessList()
HotKeySet("{ESC}", "_MyExit")

While 1
	Sleep(10000)
	Local $aProcessOld_NO[1]
	Local $aProcessNew = ProcessList()
	For $i = 1 To $aProcessNew[0][0]
		_ArraySearch($aProcessOld, $aProcessNew[$i][1], 1)
		If @error = 6 Then
			_ArrayAdd($aProcessOld_NO, $aProcessNew[$i][0] & "-" & $aProcessNew[$i][1])
			$aProcessOld_NO[0] += 1
		EndIf
	Next
	If $aProcessOld_NO[0] <> "" Then
		For $ii = 1 To $aProcessOld_NO[0]
			$aData = _WinAPI_EnumProcessWindows(StringLeft($aProcessOld_NO[$ii], _
					StringInStr($aProcessOld_NO[$ii], "-") - 1)); в справке по WinAPIEx посмотрите параметры функции
			_ArrayDisplay($aData, "Process Name-Pid: " & $aProcessOld_NO[$ii])
		Next
	EndIf
WEnd

Func _MyExit()
	Exit
EndFunc   ;==>_MyExit
WinAPIEx
 

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Anton В какой момент времени нужно выводить такой массив на экране: во время каждой проверке процессов и окон или только тогда, когда появился новый процесс или новое окно?
При каждой проверке процессов и окон что должен массив возвращать: все новые процессы с окнами с момента запуска скрипта или только новые окна и процессы с момента проверки?
 
Автор
A

Anton

Твори! Пусть завистники твои захлебываются пылью!
Сообщения
69
Репутация
3
В какой момент времени нужно выводить такой массив на экране
Я короче делаю программку которая будет следить за тем что запускает юзер, и как только он что-то запустит прога должна оперативно реагировать и сразу же скрывать все окна программы которую запустил юзер. После выводить сообщение с запросом пароля и если юзер ввел правильный пароль то скрипт показует окна программы, если нет то завершает процесс этой программы. При этом нужно учесть что юзер может не вводить пароль и не закрывать окошко с запросом, а запустить еще одну прогу и скрипт не должен молчать! он должен реагировать так же как и на запуск первой программы, скрывать окна и выводить окно с запросом пароля.
Я думал создать массив примерно такого содержания: $aRunProgram[$n][$i]

$aRunProgram[0][0] – Количество ново-запущенных программ
$aRunProgram[1][0] – PID первой запущенной программы
$aRunProgram[1][1] – Хендел первого окна первого приложения
$aRunProgram[1][2] – Хендел второго окна первого приложения
$aRunProgram[1][…]
$aRunProgram[2][0] – PID второй запущенной программы
$aRunProgram[2][1] – Хендел первого окна второго приложения
И.т.д.


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

madmasles
Большое спасибо! чуть переделаю и будет то что нужно! :ok:

Belfigor
С вашим примером разберусь попозже, щас спать иду...
 

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Набросал скрипт, который следит за появляющимися окнами во время запуска нового процесса:
Код:
#include <array.au3>
#Include <WinAPI.au3>

Global $AutoItPID = @AutoItPID

Dim $new_windows_array[20][2]
Dim $new_process_array[30][2]

Dim $new_windows_for_new_processes_array[20][4]
$new_windows_for_new_processes_array[0][1] = "Хэндл окна"
$new_windows_for_new_processes_array[0][2] = "Название процесса"
$new_windows_for_new_processes_array[0][3] = "PID процесса"

$old_process_array = ProcessList()

; ------------- Получаем начальный список окон ------------------
Dim $old_windows_array[500][2]
$start_windows_array = WinList()
For $i=1 to $start_windows_array[0][0]
	$old_windows_array[$i][0] = $start_windows_array[$i][0]
	$old_windows_array[$i][1] = $start_windows_array[$i][1]
Next
$old_windows_array[0][0] = $start_windows_array[0][0]
; ---------------------------------------------------------------

Dim $fixed_check_windows_array[500][2]

While 1
	Sleep(100)

	; ------- Сверяем список текущих процессов со списков процессов при запуске скрипта ------------
	; ----------------- И заносим новые процессы в массив $new_windows_array -----------------------
	$new_process_array[0][0] = 0
	$check_process_array = ProcessList()
	For $i=1 to $check_process_array[0][0]
		If _ArraySearch($old_process_array,$check_process_array[$i][1],1,$old_process_array[0][0],0,0,1,1) = -1 Then
			$new_process_array[0][0] += 1
			$new_process_array[$new_process_array[0][0]][0] = $check_process_array[$i][0]
			$new_process_array[$new_process_array[0][0]][1] = $check_process_array[$i][1]
		EndIf
	Next
	; ----------------------------------------------------------------------------------------------

	; -------------- Получаем список всех видимых окон (не имеющих род. окно) с момента последней проверки ------------------------
	$check_windows_array = WinList()
	$count = 0
	For $i=1 to $check_windows_array[0][0]
		If not BitAND(WinGetState($check_windows_array[$i][1]),2) Then ContinueLoop ; невидимое окно не добавится в список
		If _WinAPI_GetParent($check_windows_array[$i][1]) Then ContinueLoop ; дочернее окно не добавится в список
		If _WinAPI_GetClassName($check_windows_array[$i][1]) = "#32768" Then ContinueLoop ; не добавится окно меню, которое появляется при нажатии правой клавиши мыши на окне нового процесса

		$count += 1
		$fixed_check_windows_array[$count][0] = $check_windows_array[$i][0]
		$fixed_check_windows_array[$count][1] = $check_windows_array[$i][1]
	Next
	$fixed_check_windows_array[0][0] = $count
	; -----------------------------------------------------------------------------------------------------------------------------

	; ------------ Получаем список всех НОВЫХ видимых окон (не имеющих род. окно) с момента последней проверки --------------
	;ReDim $new_windows_array[20][2]
	$new_windows_array[0][0] = 0
	For $i=1 to $fixed_check_windows_array[0][0]
		If _ArraySearch($old_windows_array,$fixed_check_windows_array[$i][1],1,$old_windows_array[0][0],0,0,1,1) = -1 Then
			;MsgBox(0,"",_WinAPI_GetClassName($fixed_check_windows_array[$i][1]))
			$new_windows_array[0][0] += 1
			$new_windows_array[$new_windows_array[0][0]][0] = $fixed_check_windows_array[$i][0]
			$new_windows_array[$new_windows_array[0][0]][1] = $fixed_check_windows_array[$i][1]
		EndIf
	Next
	;ReDim $new_windows_array[$new_windows_array[0][0]+1][2]
	; -----------------------------------------------------------------------------------------------------------------------

	; --------------------- Делаем текущий список окон старым -------------------------
	For $i=1 to $fixed_check_windows_array[0][0]
		$old_windows_array[$i][0] = $fixed_check_windows_array[$i][0]
		$old_windows_array[$i][1] = $fixed_check_windows_array[$i][1]
	Next
	$old_windows_array[0][0] = $fixed_check_windows_array[0][0]
	; ---------------------------------------------------------------------------------

	; -------------------- Получаем новые окна для процессов, запустившихся после скрипта -----------------------------------------
	ReDim $new_windows_for_new_processes_array[20][4]

	$new_windows_for_new_processes_array[0][0] = 0
	For $i=1 to $new_windows_array[0][0]
		$PID = WinGetProcess($new_windows_array[$i][1])
		If $PID = $AutoItPID Then ContinueLoop

		$search = _ArraySearch($new_process_array,$PID,1,$new_process_array[0][0],0,0,1,1)
		If $search >= 0 Then
			$new_windows_for_new_processes_array[0][0] += 1
			$new_windows_for_new_processes_array[$new_windows_for_new_processes_array[0][0]][0] = $new_windows_array[$i][0]
			$new_windows_for_new_processes_array[$new_windows_for_new_processes_array[0][0]][1] = $new_windows_array[$i][1]
			$new_windows_for_new_processes_array[$new_windows_for_new_processes_array[0][0]][2] = $new_process_array[$search][0]
			$new_windows_for_new_processes_array[$new_windows_for_new_processes_array[0][0]][3] = $new_process_array[$search][1]
		EndIf
	Next

	ReDim $new_windows_for_new_processes_array[$new_windows_for_new_processes_array[0][0]+1][4]
	; ----------------------------------------------------------------------------------------------------------------------------

	If $new_windows_for_new_processes_array[0][0] > 0 Then _ArrayDisplay($new_windows_for_new_processes_array, "Новые окна для новых процессов")
WEnd

Func _ProcessGetLocation($PID)
	$aProc = DllCall('kernel32.dll', 'hwnd', 'OpenProcess', 'int', BitOR(0x0400, 0x0010), 'int', 0, 'int', $PID)
	If $aProc[0] = 0 Then Return SetError(1, 0, '')
	$vStruct = DllStructCreate('int[1024]')
	DllCall('psapi.dll', 'int', 'EnumProcessModules', 'hwnd', $aProc[0], 'ptr', DllStructGetPtr($vStruct), 'int', DllStructGetSize($vStruct), 'int_ptr', 0)
	$aReturn = DllCall('psapi.dll', 'int', 'GetModuleFileNameEx', 'hwnd', $aProc[0], 'int', DllStructGetData($vStruct, 1), 'str', '', 'int', 2048)
	If StringLen($aReturn[3]) = 0 Then Return SetError(2, 0, '')
	Return $aReturn[3]
EndFunc   ;==>_ProcessGetLocation
 
Автор
A

Anton

Твори! Пусть завистники твои захлебываются пылью!
Сообщения
69
Репутация
3
kzru_hunter
Просто класс!!!!!! я бы так не сумел! И хорошо что с коментами.


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

Насколько долго ReDim изменяет массив? Дело в том что скрипт kzru_hunter'a выдавал ошибку в 20 строке я сразу не понял но потом дошло в чем дело, в массиве $old_windows_array[500][2] 500 разрядов, а у меня каким то чудом оказывается больше 500 окон, поменял на 1000 и всё заработало.
Так я думаю может лучше создать массив с одной ячейкой, а потом с помощью ReDim добавлять скока нужно? Но не будет ли из за этого скрипт тормозно работать на слабой машине?
 
Верх