Что нового

Можно ли зная Class узнать его ClassNN ?

agikon

Знающий
Сообщения
789
Репутация
17
Подскажите пожалуйста, вот можно ли узнать ClassnameNN зная предварительно его Class и имя процесса?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Если Class = Edit, а экземпляр = 1, то ClassnameNN = Edit1 и т.д.
 

madmasles

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

Opt('MustDeclareVars', 1)

Global $sClass = 'Button', $iPID, $aTmp, $aRes[1][5], $hWin, $sTmp

$iPID = Run('calc.exe')
Sleep(500)
$aTmp = _WinAPI_EnumProcessWindows($iPID, 1)
If @error Then Exit 1
$hWin = $aTmp[1][0]
$aTmp = _WinAPI_EnumChildWindows($hWin)
If @error Then Exit 2
ReDim $aRes[$aTmp[0][0] + 1][5]
For $i = 1 To $aTmp[0][0]
	If $aTmp[$i][1] = $sClass Then
		$aRes[0][0] += 1
		$aRes[$aRes[0][0]][0] = 'Handle = ' & $aTmp[$i][0]
		$aRes[$aRes[0][0]][1] = 'Advanced (Class) = [CLASS:' & $sClass & '; INSTANCE:' & $aRes[0][0] & ']'
		$aRes[$aRes[0][0]][2] = 'ClassnameNN = ' & $sClass & $aRes[0][0]
		$aRes[$aRes[0][0]][3] = 'ID = ' & _WinAPI_GetDlgCtrlID($aTmp[$i][0])
		$sTmp = ControlGetText($hWin, '', $aTmp[$i][0])
		If Not $sTmp Then $sTmp = '???'
		$aRes[$aRes[0][0]][4] = 'Text = ' & $sTmp
	EndIf
Next
If $aRes[0][0] Then
	ReDim $aRes[$aRes[0][0] + 1][5]
	_ArrayDisplay($aRes)
Else
	Exit 3
EndIf


PS
На WinXP текст получает, на Win7 - нет (у меня).
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Код:
;Control Viewer - Альтернатива AutoIt Window Info -утилита
;Yashied
Func _GetNN($hWnd)

	Local $List, $Text, $ID = 0

	$Text = _WinAPI_GetClassName($hWnd)
	If Not $Text Then
		Return -1
	EndIf
	$List = _WinAPI_EnumChildWindows(_WinAPI_GetAncestor($hWnd, $GA_ROOT), 0)
	If @error Then
		Return -1
	EndIf
	For $i = 1 To $List[0][0]
		If $List[$i][1] = $Text Then
			$ID += 1
		EndIf
		If $List[$i][0] = $hWnd Then
			ExitLoop
		EndIf
	Next
	If Not $ID Then
		Return -1
	EndIf
	Return $ID
EndFunc	;==>_GetNN
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
AZJIO [?]
Если Class = Edit, а экземпляр = 1, то ClassnameNN = Edit1 и т.д.
Да, но если надо послать команду определённому классу, у которого могут быть несколько экземпляров то необходимо знать все экземпляры.




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

madmasles [?]
На WinXP текст получает
вот это именно тот код который и требуется, только почему он работает только с калькулятором?
при вписывании процесса и класса других программ этот код не работает.


Вот тот же самый код но уже с виндовской (винXP) програмой "Громкость" (sndvol32.exe), и как видите почему то код не показывает все экземпляры класса msctls_trackbar32.
Код:
#include <Array.au3>
#include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)

Global $sClass = 'msctls_trackbar32', $iPID, $aTmp, $aRes[1][5], $hWin, $sTmp

$iPID = 'sndvol32.exe'
Sleep(500)
$aTmp = _WinAPI_EnumProcessWindows($iPID, 1)
If @error Then Exit 1
$hWin = $aTmp[1][0]
$aTmp = _WinAPI_EnumChildWindows($hWin)
If @error Then Exit 2
ReDim $aRes[$aTmp[0][0] + 1][5]
For $i = 1 To $aTmp[0][0]
    If $aTmp[$i][1] = $sClass Then
        $aRes[0][0] += 1
        $aRes[$aRes[0][0]][0] = 'Handle = ' & $aTmp[$i][0]
        $aRes[$aRes[0][0]][1] = 'Advanced (Class) = [CLASS:' & $sClass & '; INSTANCE:' & $aRes[0][0] & ']'
        $aRes[$aRes[0][0]][2] = 'ClassnameNN = ' & $sClass & $aRes[0][0]
        $aRes[$aRes[0][0]][3] = 'ID = ' & _WinAPI_GetDlgCtrlID($aTmp[$i][0])
        $sTmp = ControlGetText($hWin, '', $aTmp[$i][0])
        If Not $sTmp Then $sTmp = '???'
        $aRes[$aRes[0][0]][4] = 'Text = ' & $sTmp
    EndIf
Next
If $aRes[0][0] Then
    ReDim $aRes[$aRes[0][0] + 1][5]
    _ArrayDisplay($aRes)
Else
    Exit 3
EndIf
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
agikon сказал(а):
почему то код не показывает все экземпляры класса msctls_trackbar32

Может потому что функция _WinAPI_EnumChildWindows() по умолчанию возвращает только видимые окна (элементы)?
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
Yashied [?]
Может потому что функция _WinAPI_EnumChildWindows() по умолчанию возвращает только видимые окна (элементы)?
то есть если окно свёрнуто то возвращать не будет?
так запускается кулькулятор, делаю паузу в 3 секунды. за эти 3 секунды сворачиваю калькулятор и всё-равно получает все INSTANCE.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
agikon [?]
Вот тот же самый код но уже с виндовской (винXP) програмой "Громкость" (sndvol32.exe)
Функция _WinAPI_EnumProcessWindows() работает с PID процесса, а не с его именем, как у Вас. Попробуйте поменять
Код:
$iPID = 'sndvol32.exe'
На
Код:
$iPID = ProcessExists('sndvol32.exe')
If Not $iPID Then Exit 13
;...
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
Спасибо, действительно теперь заработало.
 
Верх