Что нового

Как правильно обращаться к нужным классам окон?

ViktorSPB

Новичок
Сообщения
109
Репутация
0
В AutoIt есть функции, в которых в качестве входных параметров не хэндл окна (на сколько я понимаю, хэндл является уникальным) а класс этого окна.
Например
StatusbarGetText
С определением нужного окна можно справиться, выяснив директорию процесса. И дальше работать с этим PID и его окнами.
А если открыты из разных мест одна и та же программа, классы окон у них одинаковые.
Приведенная выше функция работает корректно с той программой, которая в данный момент активна. Кроме того, чтобы активировать окно, например используя WinActivate, опять же нужен класс. А они одинаковы.
А есть возможность без активации окна приложения обращаться именно к его классам, хоть есть и другие с таким же названием?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Честно говоря, не очень понятно, о чем речь :smile:
Может быть, это поможет:
UDFs3.chm в папке Autoit-а, а там "GuiStatusBar"
и функция
Код:
_GUICtrlStatusBar_GetText
 
Автор
V

ViktorSPB

Новичок
Сообщения
109
Репутация
0
Наверное я не ясно выразился.
Скажу сразу, эту функцию мне заставить работать не удалось, а StatusbarGetText работает.
Нюанс в том, что нужно указывать имя класса. А открыты две программы, одинаковые из разных мест. У них классы одинаковые. И описания окон одинаковые. Разные только PID и, соответственно, хэндлы окон. Вот и вопрос, как заставить функции, работающие по описаниям или классам окон, в частности StatusbarGetText работать с указанным мной окном. Я даже активировать нужное окно не могу корректно, там опять имя класса или описание нужно. А у меня различаются только PID.
Так яснее?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
ViktorSPB [?]
нужно указывать имя класса
А зачем, обращайтесь по Handle.
Код:
Run(@ProgramFilesDir & '\Internet Explorer\IEXPLORE.EXE')
$hWin = WinWait('[Class:IEFrame]')
Sleep(3000)
$sStatus = StatusbarGetText($hWin)
$sTitle = WinGetTitle($hWin)
MsgBox(64, 'Info', 'Statusbar Text :' & $sStatus & @LF & 'Title :' & $sTitle)
 
Автор
V

ViktorSPB

Новичок
Сообщения
109
Репутация
0
WinWait работает так же по классу или описанию окна.
А у меня 2 программы запущены. Одинаковые. Классы в них одинаковые. Как мне взять то, что нужно из второй программы а не из первой?
Вот в чем проблема.
Ну представьте, запущены 2 эксплорера. И Вы из одного из них хотите получить текст из StatusBar. Вот у меня похожая ситуация, только программы не из одной директории запускаются, а из разных. Я только так могу окна и процессы разделить.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Проверяем такой код:

Код:
#Include <Array.au3>
#Include <WinAPIEx.au3>
#Include <GuiStatusBar.au3>

Local $hPsAPI = 'psapi.dll'
Local $hKernel = 'kernel32.dll'

$list = ProcessList("info.exe")
For $i = 1 to $list[0][0]
$Path=_ProcessGetPath($list[$i][1])
If $Path= 'C:\QUIK\info.exe' Then ; путь
$hForm=_WinAPI_EnumProcessWindows ($list[$i][1], 1)
Endif
Next

For $n = 1 to UBound($hForm,1) - 1
If $hForm[$n][1] = 'InfoClass' Then
$handle = $hForm[$n][0]
Endif
Next

$aData=_WinAPI_EnumChildWindows($handle,0)

;_ArrayDisplay($aData, '_WinAPI_EnumChildWindows')

For $i = 1 to UBound($aData,1) - 1 ; перебираем все видимые и не видимые дочерние окна, получаем их хэндлы 
If $aData[$i][1] = 'msctls_statusbar32' Then
$text=_GUICtrlStatusBar_GetText($aData[$i][0], 5); индекс, который указывает на часть статус-бара, в данном случае от 0 до 6
MsgBox(0, '', $text)
EndIf
Next

Func _ProcessGetPath($hPID)
    Local $sPath = DllStructCreate('char[1000]')
    Local $hProcess = DllCall($hKernel, 'int', 'OpenProcess', 'dword', 0x0400 + 0x0010, 'int', 0, 'dword', $hPID)
    DllCall($hPsAPI, 'long', 'GetModuleFileNameEx', 'long', $hProcess[0], 'int', 0, 'ptr', DllStructGetPtr($sPath), 'long', DllStructGetSize($sPath))
    DllCall($hKernel, 'int', 'CloseHandle', 'hwnd', $hProcess[0])
    Local $ret = DllStructGetData($sPath, 1)
    Return $ret
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
WSWR,
А чем Вам _WinAPI_GetProcessFileName() из WinAPIEx.au3 не нравится?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
madmasles
Да нравится она мне :smile:
Просто на _ProcessGetPath наткнулся раньше.
 
Автор
V

ViktorSPB

Новичок
Сообщения
109
Репутация
0
WSWR, спасибо!
Все заработало.
Я _GUICtrlStatusBar_GetText пытался использовать, но не разобрался во входных данных. И результат был упорно нулевой.
Теперь вижу, что это отличная функция.
Спасибо Вам большое. :smile:
И Вам, madmasles, спасибо за участие :smile:
Вопрос закрыт :IL_AutoIt_1:
 
Верх