Что нового

Скрыть MsgBox и нажать на нем кнопку

Автор
T

The_Immortal

Новичок
Сообщения
84
Репутация
4
InnI, теперь всё понял, спасибо! [?]
Последствия бывают критичны, т.к. может не хватить времени для создания кнопки и клик не пройдёт.
Тогда я оставлю так:

Код:
$Opt = Opt("WinWaitDelay", 0)
$hWnd = WinWait("MyTitle", "Вы подтверждаете свои действия?")
WinMove($hWnd, "", -5000, -5000)
Opt("WinWaitDelay", $Opt)
ControlClick($hWnd, "", "Button1")


"0 мс" в данном случае ничем не чревато?

Только вот... Звуковой эффект (который несет этот Бокс) логичным образом остается))) Этот звук невозможно "спрятать", наверное, да?
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
The_Immortal
Нет, так бесполезно. Опцию вы включите для следующих Win-функций, которые будут после. А WinMove так и будет с нулём ожидания. Поэтому, после перемещения окна сделайте паузу 30-50 мс, кликните кнопку и уже потом устанавливайте опцию.


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

The_Immortal
Звуковой эффект
Поищите по форуму - включение/отключение звука.
 
Автор
T

The_Immortal

Новичок
Сообщения
84
Репутация
4
InnI, [?]
Поищите по форуму - включение/отключение звука.
Да, это уже другой разговор.

Включил Ваше решение в общую задачу:

1. Появляется изначальное окно - жмем на нем "ОК" ("Button1").
2. Открывается Бокс с содержанием "Вы подтверждаете свои действия?" - отвечаем на нём "Да" ("Button1").
3а. Если прошло всё успешно, то выводится следующий Бокс с содержанием "Операция успешно выполнена" - жмем на нем "ОК" ("Button1"). На этом конец.
3б. Если произошла ошибка, то вместо Бокса 3а, появляется Бокс с содержанием "Произошла ошибка" - жмем на нем "ОК" ("Button1"). На этом конец.

Всё очень просто:

Код:
$sTitle = "MyTitle"
$sFileExe = "program.exe"
$TextWin2 = "подтверждаете"
$TextWin3a = "успешно"
$TextWin3b = "ошибка"

Run($sFileExe, "", @SW_HIDE)
$hWin = WinWait($sTitle)
$Opt = Opt("WinWaitDelay", 0)
ControlClick($hWin, "", "Button1") ; п. 1

_HideBox ($sTitle, $TextWin2) ; п. 2

_HideBox ($sTitle, $TextWin3a) ; п. 3а

_HideBox ($sTitle, $TextWin3b) ; п. 3б

Func _HideBox ($sTitle, $TextWin)
	$hWnd = WinWait($sTitle, $TextWin, 1) ; ожидать 1 сек - это долго

	If ($hWnd) Then
		WinMove($hWnd, "", -5000, -5000)
		Sleep(50)
		ControlClick($hWnd, "", "Button1")
	EndIf
EndFunc


Проблема в том, что если возникает ошибка (окно 3б), то тогда окно 3а не появится (и наоборот), поэтому приходится делать паузу в 1 секунду, чтобы не ожидать вечно окна, которое никогда не появится. И из-за этой секунды окно 3б появляется.

WinWait, почему-то не позволяет использовать в качестве тайм-аута миллисекунды. Это можно как-то исправить? Я думаю, это решило бы проблему.

OffTopic:
P.S. Извиняюсь, что сразу не обозначил полную задачу. Я стараюсь минимизировать условия (дабы не нагружать форумчан) в надежде, что всё остальное получится решить аналогично. Но, увы...
 
Автор
T

The_Immortal

Новичок
Сообщения
84
Репутация
4
OffTopic:
Alofa, мой 22 пост касается проблематике, обозначенной в заголовке: итоговый Бокс не скрывается. Если я создам на основе данного поста отдельную тему, то она будет называться точно также и нести аналогичную семантическую нагрузку. Так что никаких нарушений.
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
The_Immortal
Что-то вы мудрите.
У вас три окна с одинаковым заголовком. Ждёте первое (с текстом $TextWin2), закрываете. Теперь дождитесь его закрытия
Код:
WinWaitClose()
Далее вам нужно закрыть ЛЮБОЕ из окон с тем же заголовком и такой же кнопкой Button1. Для этого нужно указать заголовок, а текст оставить пустым. Всё. Если хотите узнать, какое из окон вы закрыли, то перед кликом прочитайте его текст
Код:
If StringInStr(WinGetText($sTitle), $TextWin3a) Then
  ConsoleWrite($TextWin3a & @CRLF)
Else
  ConsoleWrite($TextWin3b & @CRLF)
EndIf
 
A

Alofa

Гость
The_Immortal сказал(а):
2. Открывается Бокс с содержанием "Вы подтверждаете свои действия?" - отвечаем на нём "Да" ("Button1").
3а. Если прошло всё успешно, то выводится следующий Бокс с содержанием "Операция успешно выполнена" - жмем на нем "ОК" ("Button1"). На этом конец.
3б. Если произошла ошибка, то вместо Бокса 3а, появляется Бокс с содержанием "Произошла ошибка" - жмем на нем "ОК" ("Button1"). На этом конец.
Проще говоря в п.2 жмем "Да", а затем всегда "ОК".

Вот еще вариант. Спасибо Yashied и firex за наводку (Ссылка).
Здесь вообще не учитываются ни заголовки, ни текст окон - все пляшется от процесса.

Код:
#include <WinAPIProc.au3>
#include <WinAPI.au3>

$sFileExe = 'program.exe'
$iPid = Run($sFileExe, '', @SW_HIDE)
$hWin = _WinHide()

Sleep(2000) ; Это имитация каких-либо своих действий

ControlClick($hWin, '', '[CLASS:Button; INSTANCE:1]')
$hWin = _WinHide()
$sControl = ControlGetFocus($hWin)
ControlClick($hWin, '', $sControl) ; кликаем элемент, который имеет фокус ввода в MsgBox (т.е. кнопку "Да")
; Далее по аналогии можно повторить "_WinHide()" для следующего MsgBox - только учтите, что возможно придется подкорректировать там таймер, чтобы не вмешивался.

; Проверяем результат
If ProcessWaitClose($iPid, 2) Then
    MsgBox(64, 'Отчет', 'Ура Получилось!')
Else
    RunWait(@SystemDir & '\taskkill.exe /F /IM ' & $sFileExe &' /T', '', @SW_HIDE) ; Закрываем процесс и все его дочерние процессы
    MsgBox(48, 'Отчет', 'Программа закрыта принудительно!')
EndIf

; Функция скрывающая окно
Func _WinHide()
    $iTimer = TimerInit() ; Включаем таймер - это необходимо для предотвращения возможного бесконечного цикла (перестраховка)
    Do
        $aWnd = _WinAPI_EnumProcessWindows($iPid); => Описание функции (http://autoit-script.ru/index.php?topic=229.0)
;                                                               или(https://www.autoitscript.com/autoit3/docs/libfunctions/_WinAPI_EnumProcessWindows.htm)
        If Not @Error Then
            $WinHide = _WinAPI_ShowWindow($aWnd[1][0], @SW_HIDE) ;Скрываем окно
            If $WinHide Then
                Return $aWnd[1][0] ; Возвращаем Handle скрытого окна из функции в переменную "$hWin"
            Else
                Return 0
            EndIf
        EndIf
    Until TimerDiff($iTimer) >= 1000 ; Максимальное время работы цикла 1 секунда
EndFunc
 
Автор
T

The_Immortal

Новичок
Сообщения
84
Репутация
4
Ребят, а какой функцией можно определить есть ли у такого-то окна такой-то контрол (с таким-то параметрами - классом, ID, названием и т.п.), имея в наличии только хэндл этого окна?
Код:
ControlGetHandle
- в этом не помогает, потому, как если я в качестве первого параметра укажу хэндл, то независимо ото остальных параметров (несуществующих), эта функция возвращает мне всегда "хэндловское" значение.
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
The_Immortal
есть ли у такого-то окна такой-то контрол (с таким-то параметрами - классом, ID, названием и т.п.)
Заполните соответствующие параметры функции ControlGetHandle и, если она вернёт хэндл, значит контрол есть. В противном случае элемента с заданными параметрами у окна нет.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
The_Immortal [?]
какой функцией можно определить есть ли у такого-то окна такой-то контрол
Код:
$hGUI = GUICreate('Test')
GUICtrlCreateButton('OK', 20, 20)

$bExists = _ControlExists($hGUI, 'Button1', 'OK')
MsgBox(0, '', $bExists)

Func _ControlExists($hWnd, $sID, $sText = '')
	Local $sClassList = WinGetClassList($hWnd)
	Local $aClassList = StringSplit(StringStripWS($sClassList, 3), @LF)
	Local $sHold_List = '|'
	Local $aiInHold, $iInHold
	
	$sClassList = ''
	
	For $i = 1 To UBound($aClassList) - 1
		If StringRegExp($sHold_List, '\|' & $aClassList[$i] & '~(\d+)\|') Then
			$aiInHold = StringRegExp($sHold_List, '.*\|' & $aClassList[$i] & '~(\d+)\|.*', 1)
			$iInHold = Number($aiInHold[UBound($aiInHold)-1])
			
			If $iInHold = 0 Then $iInHold += 1
			
			$aClassList[$i] &= '~' & $iInHold + 1
			$sHold_List &= $aClassList[$i] & '|'
			$sClassList &= $aClassList[$i] & @LF
		Else
			$aClassList[$i] &= '~1'
			$sHold_List &= $aClassList[$i] & '|'
			$sClassList &= $aClassList[$i] & @LF
		EndIf
	Next
	
	Local $aCtrls = StringSplit(StringReplace(StringStripWS($sClassList, 3), '~', ''), @LF)
	
	For $i = 1 To $aCtrls[0]
		If $aCtrls[$i] = $sID And ($sText = '' Or $sText = ControlGetText($hWnd, '', $sID)) Then
			Return True
		EndIf
	Next
	
	Return False
EndFunc
 
A

Alofa

Гость
Автор
T

The_Immortal

Новичок
Сообщения
84
Репутация
4
Alofa, [?]
А как-то бывает иначе?
Я не знаю в чём проблема, но когда я ранее тестировал данную функцию таким образом
Код:
$hWin = WinList("MyTitle")
$hWin1 = ControlGetHandle($hWin[1][1], "",  "CLASS:TButton; INSTANCE:100500]") ; INSTANCE указан несуществующий
If $hWin1 Then
	ConsoleWrite($hWin1 & @CRLF)
Else
	ConsoleWrite("Nothing" & @CRLF)
EndIf
, то если я ничего не путаю, мне возвращался какой-то хэндл (чей именно я не узнавал), хотя в данном случае ничего не должно возвращаться. Но может я тогда опять как всегда накосячил где-то - не уверен, т.к. может быть указал что-то не так.

Но сейчас всё работает как часы (как и указал уважаемый InnI):

1) вышеуказанный пример возвращает пустоту (т.к. INSTANCE такого нет);

2)
Код:
$hWin = WinList("MyTitle")
$hWin1 = ControlGetHandle($hWin[1][1], "",  "CLASS:TButton; INSTANCE:1") ; INSTANCE указан существующий
If $hWin1 Then
	ConsoleWrite($hWin1 & @CRLF)
Else
	ConsoleWrite("Nothing" & @CRLF)
EndIf
- возвращается хэндл нужной кнопки;

3)
Код:
$hWin = WinList("MyTitle")
$hWin1 = ControlGetHandle($hWin[1][1], "",  "")
If $hWin1 Then
	ConsoleWrite($hWin1 & @CRLF)
Else
	ConsoleWrite("Nothing" & @CRLF)
EndIf
- возвращается хэндл окна (этот пример я указал к Вашему сообщению из соседней темы).
 
Автор
T

The_Immortal

Новичок
Сообщения
84
Репутация
4
InnI, да-да, я только что ознакомился (не увидел ранее эту тему), теперь всё понятно. Благодарю!



UPD:
Друзья, всё-таки я не оставил идею решить это [?]
1. Появляется изначальное окно - жмем на нем "ОК" ("Button1").
2. Открывается Бокс с содержанием "Вы подтверждаете свои действия?" - отвечаем на нём "Да" ("Button1").
3а. Если прошло всё успешно, то выводится следующий Бокс с содержанием "Операция успешно выполнена" - жмем на нем "ОК" ("Button1"). На этом конец.
3б. Если произошла ошибка, то вместо Бокса 3а, появляется Бокс с содержанием "Произошла ошибка" - жмем на нем "ОК" ("Button1"). На этом конец.
через другой рабочий стол.

Сделал, правда, коряво, но по-другому не получилось:

Код:
#Include <WinAPIEx.au3>

$sFileExe = "program.exe"
Global $hNewDesktop = _WinAPI_CreateDesktop( "ShellExecuteHidden_Desktop", 0x10000000) ; создаем другой рабочий стол
Global $pid

_shellExecuteHidden($sFileExe, "") ; запускаем program.exe на другом рабочем столе

$hWin = _GetWindow("TFormMain") ; получаем хэндл главного окна
Sleep(3000) ; !!! тут хотелось бы использовать что-то типа WinWait($hWin), но это приведет к вечному ожиданию, т.к. функция не видит окно на другом рабочем столе
ControlClick($hWin, "", "TButton1") ; п.1: жмем "ОК" на главном окне

$hWin = _GetWindow("#32770") ; получаем хэндл Бокса "Да/Нет"
Sleep(3000) ; !!! тут хотелось бы использовать что-то типа WinWaitClose($hWin), но это приведет к вечному ожиданию, т.к. функция не видит окно на другом рабочем столе
ControlClick($hWin, "", "Button1")  ; п.2: жмем "Да" на Боксе

$hWin = _GetWindow("#32770") ; получаем хэндл последнего Бокса "ОК"
Sleep(3000) ; !!! тут хотелось бы использовать что-то типа WinWaitClose($hWin), но это приведет к вечному ожиданию, т.к. функция не видит окно на другом рабочем столе
ControlClick($hWin, "", "Button1")  ; п.3а / п. 3б: жмем последний "ОК" на Боксе


Func _shellExecuteHidden( $filepath , $parameters = "")

    $tProcess = DllStructCreate( $tagPROCESS_INFORMATION )
    $tStartup = DllStructCreate( $tagSTARTUPINFO )
    DllStructSetData( $tStartup , 'Size', DllStructGetSize( $tStartup) )
    DllStructSetData( $tStartup , 'Desktop', _WinAPI_CreateString(  "ShellExecuteHidden_Desktop" ) )

    _WinAPI_CreateProcess( $filepath , $parameters , 0, 0, 0, 0x00000200 , 0, 0, DllStructGetPtr($tStartup), DllStructGetPtr($tProcess))
    $pid =  DllStructGetData( $tProcess , 'ProcessID' )

EndFunc


Func _GetWindow ($WinClassName)
    $aWindows = _WinAPI_EnumDesktopWindows($hNewDesktop) 
	
	If IsArray( $aWindows ) Then

		For $i = 1 to $aWindows[0][0]
			$hWnd = $aWindows[$i][0]
			If WinGetProcess( $hWnd ) = $pid And $aWindows[$i][1] = $WinClassName Then
				Return ($hWnd)
			EndIf
		Next
	EndIf

EndFunc


Вроде работает, но пришлось увеличить паузы до таких значений, потому как при меньших бывают проблемы - все контролы почему-то не успевают появиться. Но раз на раз не приходится и иногда всё происходит быстро, поэтому хотелось бы как-то отловить когда форма с контролами готова для клика. Win-функции тут не помощники, т.к. они работают с текущим рабочим столом - как запустить их в пределах другого рабочего стола - не имею понятия. Подскажите, пожалуйста, что можно придумать в данном случае?

Спасибо!

P. S. Пробовал вот таким образом:

Код:
While Not ControlClick($hWin, "", "TButton1") ; ожидаем, пока контрол не получит клик
WEnd
- но так почему-то получается бесконечный цикл, да и ЦП нагружается...

Я понял почему так:

Код:
$hWin = _GetWindow("TFormMain") ; !!! проблема здесь - в $hWin пока пусто, туда не успел прилететь хэндл окна
ControlClick($hWin, "", "TButton1")


Т.е. можно решить следующим образом (делаю ожидание хэндла в функции _GetWindow):

Код:
#Include <WinAPIEx.au3>

$sFileExe = "program.exe"
Global $hNewDesktop = _WinAPI_CreateDesktop( "ShellExecuteHidden_Desktop", 0x10000000) ; создаем другой рабочий стол
Global $pid

_shellExecuteHidden($sFileExe, "") ; запускаем program.exe на другом рабочем столе

$hWin = _GetWindow("TFormMain") ; получаем хэндл главного окна
If ControlClick($hWin, "", "TButton1") Then; п.1: жмем "ОК" на главном окне
	ConsoleWrite("Click 1" &  @CRLF)
EndIf

$hWin = _GetWindow("#32770") ; получаем хэндл Бокса "Да/Нет"
If ControlClick($hWin, "", "Button1") Then ; п.1: жмем "ОК" на главном окне
	ConsoleWrite("Click 2" &  @CRLF)
EndIf

$hWin = _GetWindow("#32770") ; получаем хэндл последнего Бокса "ОК"
ConsoleWrite(WinGetText($hWin) &  @CRLF)
If ControlClick($hWin, "", "Button1") Then ; п.1: жмем "ОК" на главном окне
	ConsoleWrite("Click 3" &  @CRLF)
EndIf


Func _shellExecuteHidden( $filepath , $parameters = "")
...
EndFunc


Func _GetWindow ($WinClassName= "")

	While (1) ; !!! Ожидаем, пока не придет нужный хэндл
		$aWindows = _WinAPI_EnumDesktopWindows($hNewDesktop)

		If IsArray( $aWindows ) Then
			For $i = 1 to $aWindows[0][0]
				$hWnd = $aWindows[$i][0]
				If WinGetProcess( $hWnd ) = $pid And $aWindows[$i][1] = $WinClassNameThen
					If ($hWnd) Then
						ConsoleWrite("Handle: " &  $hWnd & @CRLF)
						Return $hWnd
					EndIf
				EndIf
			Next
		EndIf
	WEnd

EndFunc


Но почему-то так не всегда срабатывает 3-ий (последний) клик :( А как отследить причину этого я не знаю...

Может есть какой-нибудь другой способ отследить полную загрузку окна на другом рабочем столе?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Полная загрузка окна происходит тогда, когда оно становится видимым. Проверяйте до тех пор, пока окно не установит этот флаг.
 
Автор
T

The_Immortal

Новичок
Сообщения
84
Репутация
4
Yashied, благодарю!

Код:
While NOT _WinAPI_IsWindowVisible(_GetWindow("TFormMain")) ; ожидаем видимости окна
	Sleep(50)
WEnd
$hWin = _GetWindow("TFormMain") ; получаем хэндл главного окна
If ControlClick($hWin, "", "TButton1") Then; п.1: жмем "ОК" на главном окне
	ConsoleWrite("Click 1" &  @CRLF)
EndIf

While NOT _WinAPI_IsWindowVisible(_GetWindow("#32770"))
	Sleep(50)
WEnd
$hWin = _GetWindow("#32770") ; получаем хэндл Бокса "Да/Нет"
If ControlClick($hWin, "", "Button1") Then ; п.1: жмем "ОК" на главном окне
	ConsoleWrite("Click 2" &  @CRLF)
EndIf

While NOT _WinAPI_IsWindowVisible(_GetWindow("#32770"))
	Sleep(50)
WEnd
$hWin = _GetWindow("#32770") ; получаем хэндл последнего Бокса "ОК"
If ControlClick($hWin, "", "Button1") Then ; п.1: жмем "ОК" на главном окне
	ConsoleWrite("Click 3" &  @CRLF)
EndIf


Проблема ушла, но такого рода конструкции
Код:
While NOT _WinAPI_IsWindowVisible(_GetWindow("TFormMain")) ; ожидаем видимости окна
	Sleep(50)
WEnd
неизбежно нагружают ЦП, а мне их приходится использовать аж три раза :(
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
И переместите проверку _WinAPI_IsWindowVisible() в функцию _GetWindow(). В идеале _GetWindow() будет состоять из двух последовательных циклов - ожидание появления окна и ожидание его видимости.
 
Автор
T

The_Immortal

Новичок
Сообщения
84
Репутация
4
Yashied, что-то типа такого:

Код:
Func _GetWindow ($ClassName = "")

	While 1
		$aWindows = _WinAPI_EnumDesktopWindows($hNewDesktop)

		If IsArray( $aWindows ) Then
			For $i = 1 to $aWindows[0][0]
				$hWnd = $aWindows[$i][0]
				If WinGetProcess( $hWnd ) = $pid And $aWindows[$i][1] = $ClassName Then
					If ($hWnd) Then
						While NOT _WinAPI_IsWindowVisible($hWnd)
							Sleep(50)
						WEnd
						Return $hWnd
					EndIf
				Else
					ContinueLoop
				EndIf
			Next
		EndIf
	WEnd

EndFunc


?
 
Автор
T

The_Immortal

Новичок
Сообщения
84
Репутация
4
Alofa,[?]
Поэтому сейчас мне интересно, чем дело-то у вас закончилось?
Ваш код критиковать не могу (хотя он явно оптимизирован), т.к. я явно не "специалист", а вот мой (собственно, я его и не трогал после последнего моего сообщения в данной теме) отрабатывает без каких-либо проблем:

Код:
#Include <WinAPIEx.au3>

$sFileExe = "program.exe"
Global $hNewDesktop = _WinAPI_CreateDesktop( "ShellExecuteHidden_Desktop", 0x10000000) ; создаем другой рабочий стол
Global $pid

_shellExecuteHidden($sFileExe, "") ; запускаем program.exe на другом рабочем столе

$hWin = _GetWindow("TFormMain") ; получаем хэндл главного окна
ControlClick($hWin, "", "TButton1")

$hWin = _GetWindow("#32770") ; получаем хэндл Бокса "Да/Нет"
ControlClick($hWin, "", "Button1")

$hWin = _GetWindow("#32770") ; получаем хэндл последнего Бокса "ОК"
ControlClick($hWin, "", "Button1")


Func _shellExecuteHidden( $filepath , $parameters = "")

    $tProcess = DllStructCreate( $tagPROCESS_INFORMATION )
    $tStartup = DllStructCreate( $tagSTARTUPINFO )
    DllStructSetData( $tStartup , 'Size', DllStructGetSize( $tStartup) )
    DllStructSetData( $tStartup , 'Desktop', _WinAPI_CreateString(  "ShellExecuteHidden_Desktop" ) )

    _WinAPI_CreateProcess( $filepath , $parameters , 0, 0, 0, 0x00000200 , 0, 0, DllStructGetPtr($tStartup), DllStructGetPtr($tProcess))
    $pid =  DllStructGetData( $tProcess , 'ProcessID' )

EndFunc


Func _GetWindow ($ClassName = "")

    While 1
        $aWindows = _WinAPI_EnumDesktopWindows($hNewDesktop)

        If IsArray( $aWindows ) Then
            For $i = 1 to $aWindows[0][0]
                $hWnd = $aWindows[$i][0]
                If WinGetProcess( $hWnd ) = $pid And $aWindows[$i][1] = $ClassName Then
                    If ($hWnd) Then
                        While NOT _WinAPI_IsWindowVisible($hWnd)
                            Sleep(50)
                        WEnd
                        Return $hWnd
                    EndIf
                Else
                    ContinueLoop
                EndIf
            Next
        EndIf
    WEnd

EndFunc
Правда, я тут убрал разного рода проверки, завершение процесса, а также закрытие рабочего стола, но в остальном всё ок.

У меня, кстати, была ещё одна такая интересная особенность. Я запускаю program.exe на другом рабочем столе (РС1). После этого запрашиваю все (в том числе и скрытые окна), расположенные на РС1 - к процессу program.exe вижу только его родительское окно. Хм... А где же все MsgBox'ы? А они в этот момент оказались на дефолтном рабочем столе и, естественно, в скрытом виде. Есть мысли почему так? Почему они не скрылись на РС1, там где и вызывался program.exe?


UPD: у меня Ваш код не сработал:
Код:
(67) : ==> Subscript used on non-accessible variable.:
ControlClick($aData[1][0], '', '[CLASS:TButton; ID:6]')
ControlClick($aData^ ERROR
, т.к. вот здесь
Код:
$aData = _WinAPI_EnumProcessWindows($iPid)
при первой же итерации в $aData ничего не попадает, а в $iPid сидит корректно значение. Но это я как всегда что-то мог намудрить :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
_WinAPI_EnumProcessWindows($iPid, False)


Но в данном случае правильнее использовать _WinAPI_EnumDesktopWindows().
 
Верх