#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