Что нового

[Окна, Диалоги] Получение значение class окна по pid или название процесса для 4 окон

evgenariy

Новичок
Сообщения
7
Репутация
0
Получение значение class окна по pid или название процесса для 4 окон
Вообщем прошу помощи
Написал скрипт для одной игрухи
Суть в том что открывается несколько копий игры, и далее происходит работа скрипта
в скрипт сам вставляю название класса для
Код:
$hWnd1 = WinWait("[CLASS:swiftgame.exe_{71b34bc0-dbd0-11e3-8067-002522df525a}]", "", 5)
........
$hWnd4 = WinWait("[CLASS:swiftgame.exe_{71b49sad-dbd0-11e3-8067-002522df525a}]", "", 5)


Значение Class я получаю вручную с помощью AutoitWindowInfo (вкладка Basic Window Info, поле Class)
и при каждом запуске вручную вставляю в скрипт и запускаю (очень муторно каждый раз)

Собстна вопрос возможно ли получить значение Class для запущенных приложений скриптом

Примерно как-то так
Код:
;получение значений class1, ..., class4

$hWnd1 = WinWait("[CLASS:class1]", "", 5)
........
$hWnd4 = WinWait("[CLASS:class4]", "", 5)


Количество запущенных копий окон всегда - 4 штуки
Имя процесса всегда одно и тоже - SwiftGame.exe
Имя окна тоже одинаковой SwiftGame

Заранее тысяча благодарностей
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
evgenariy,
Пример получения Handle и Class видимых окон по неполному классу окна и привязки их к PID процесса при запуске нескольких копий одного файла (в примере - блокнот).
Код:
#include <WinAPI.au3>
#include <Array.au3>

Global $aRes[5][3] = [[4]], $sClass = '[REGEXPCLASS:Note.*]', $sPath = @WindowsDir & '\notepad.exe', $aTmp, $iTmpPID

For $i = 1 To $aRes[0][0]
	$aRes[0][1] = Run($sPath)
	If $aRes[0][1] Then
		$aRes[$i][0] = $aRes[0][1]
		$aRes[0][2] += 1
	EndIf
Next
$aRes[0][1] = TimerInit()
While TimerDiff($aRes[0][1]) < 5000
	Sleep(250)
	$aTmp = WinList($sClass)
	If Not $aTmp[0][0] Then
		ContinueLoop
	EndIf
	For $i = 1 To $aTmp[0][0]
		If Not BitAND(WinGetState($aTmp[$i][1]), 2) Then
			ContinueLoop
		EndIf
		$iTmpPID = WinGetProcess($aTmp[$i][1])
		For $j = 1 To $aRes[0][0]
			If $iTmpPID = $aRes[$j][0] Then
				$aRes[$j][1] = $aTmp[$i][1]
				$aRes[$j][2] = _WinAPI_GetClassName($aRes[$j][1])
				$aRes[0][2] -= 1
				ExitLoop
			EndIf
		Next
	Next
	If Not $aRes[0][2] Then ExitLoop
WEnd
$aTmp = 0
$aRes[0][0] = 'PID:'
$aRes[0][1] = 'Handle:'
$aRes[0][2] = 'Class:'
_ArrayDisplay($aRes)

For $i = 1 To UBound($aRes) - 1
	ControlSend($aRes[$i][1], '', '[CLASS:Edit; INSTANCE:1]', StringFormat('%s\t%s\r\n%s\t%s\r\n%s\t%s\r\n', $aRes[0][0], $aRes[$i][0], _
			$aRes[0][1], $aRes[$i][1], $aRes[0][2], $aRes[$i][2]))
Next
 

illja

Знающий
Сообщения
30
Репутация
10
Код:
Local $aProcesses = ProcessList('game.exe')

For $i = 1 To $aProcesses[0][0] Step +1
msgbox(0,0, & $aProcesses[$i][1])
Next

;Выдаст список пидов всех гейм екзе


Local $Title = $SL

$aWindows = WinList('Хоть часть заголовка окна моей игры')

For $i2 = 1 To $aWindows[0][0] Step +1
	If WinGetProcess($aWindows[$i2][1]) = $Pid Then
	$Win = $aWindows[$i2][1]
	EndIf
	Next
Next

;Сопоставляет пид с названием игры и получает хендл окна
 
Автор
E

evgenariy

Новичок
Сообщения
7
Репутация
0
Спасибо, всем
адаптировал решения под себя и ускорил процесс однако у меня не работает код в одном месте
в чем может быть ошибка?

Код:
$a1 = '"CLASS:GameCenter{bac12251-dcc5-11e3-8069-002522df525a}]"'
;&a1 = "CLASS:GameCenter{bac12251-dcc5-11e3-8069-002522df525a}]"
$hWnd1 = Winwait($a1, "", 500)
Sleep(500)
WinActivate($hWnd1)


окно упорно не активируется, как я не мучался
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
evgenariy [?]
окно упорно не активируется, как я не мучался
Надо бы еще проверку делать.
Код:
$sClass1 = '[CLASS:GameCenter{bac12251-dcc5-11e3-8069-002522df525a}]'
$hWnd1 = WinWait($sClass1, '', 3)
If $hWnd1 Then
	WinActivate($hWnd1)
Else
	MsgBox(16, 'Error', 'No window')
EndIf
 
Верх