PDA

Показать полную графическую версию : [решено] Поиск нужного окна


DjinnKo
17-07-2009, 12:40
Здравствуйте, есть такая ситуация.
Есть окно, которое может открыться через 1 мин, а может вообще не открыться. в случае если оно откроется мне нужно его найти, собственно проблема в чем:
1) Окно не имеет постоянного названия(то есть окно может быть на множестве языков), по этому по заголовку искать нельзя.
2)

>>>> Window <<<<
Title: Окно
Class: #32770

Собственно и по классу нельзя искать...

Есть положительный момент, есть у него процесс который я могу найти, но как по процесу найти открытое окно (заголовок) мне не ясно.
Подскажите плз что делать в данной ситуацие ? :(

Заранее благодарен.

Yashied
17-07-2009, 14:15
http://www.autoitscript.com/forum/index.php?showtopic=85167&view=findpost&p=610777

DjinnKo
17-07-2009, 14:27
а как по названию получить PID ?
чет не могу в оффлайн доке найти... :)
Yashied, тебе большое спасибо :)

Yashied
17-07-2009, 14:39
а как по названию получить PID ? »
ProcessExists() возвращает PID.

DjinnKo
17-07-2009, 16:21
Знаете что странно ? о_О
Func _WinGetByPid($iPID)
Local $aWList = WinList()
Local $aRet[1] = [0]

For $iCC = 0 To $aWList[0][0]
If WinGetProcess($aWList[$iCC][1]) = $iPID AND _
BitAND(WinGetState($aWList[$iCC][1]), 2) Then
ReDim $aRet[UBound($aRet)+1]
$aRet[0] += 1
$aRet[$aRet[0]] = $aWList[$iCC][0]
EndIf
Next
If $aRet[0] = 0 Then
Return SetError(1, 0, 0)
Else
Return $aRet
EndIf
EndFunc

$k = ProcessExists("FD.exe")
$h = _WinGetByPid($k)
Sleep(2000)
$titleP = WinGetTitle($h,"")
ConsoleWrite($titleP)
Подобная фигня возвращает имя активного окна :( а не открытого окна этого процесса :(

Yashied
17-07-2009, 19:58
Подобная фигня возвращает имя активного окна а не открытого окна этого процесса »
Насколько я понял, эта фигня (т.е _WinGetByPid()) возвращает массив, состоящий из заголовков (имен) окон, связанных с данным процессом. Первый элемент массива (т.е нулевой, в твоем случае - $r[0]) содержит полное количество окон (т.е количество элементов в массиве, начиная с 1).

For $i = 1 To $r[0]
...
Next

Если твоя программа имеет только одно окно (активное или нет - не имеет особого значения), тогда

$sTitle = $r[1]
$hWnd = WinGetHandle($r[1])

Зная $hWnd, ты можешь колдовать дальше.

Я проверил эту функцию на "Блокноте", все работает отлично!

proxy
17-07-2009, 21:08
пример поиска окна по процессу:

Opt('MustDeclareVars', 1)
Opt('TrayIconDebug', 1)
Opt('TrayIconHide', 0)

Local $iPID, $aWin

$iPID = ProcessExists('notepad.exe')
If NOT ProcessExists('notepad.exe') Then
$iPID = Run('notepad.exe')
WinWait('[Class:Notepad]')
EndIf

$aWin = _ProcessGetWindow($iPID)
If NOT @error Then
MsgBox(64, 'Поиск окна', 'Процесс "notepad.exe"' & @CRLF & @CRLF & @TAB & 'указатель: ' & $aWin[1] & @CRLF & @TAB & 'заголовок: ' & $aWin[0])
Else
MsgBox(64, 'Поиск окна', 'Ошибка поиска окна')
EndIf

Func _ProcessGetWindow($iPID, $iRet=-1)
Local $aWinList = WinList()
Local $aRet[2]

If IsString($iPID) Then $iPID = ProcessExists($iPID)

For $i = 1 To UBound($aWinList)-1
If WinGetProcess($aWinList[$i][1]) = $iPID Then
$aRet[0] = $aWinList[$i][0] ;Title
$aRet[1] = $aWinList[$i][1] ;WinHandle

If $iRet = 0 Then Return $aRet[0]
If $iRet = 1 Then Return $aRet[1]

Return $aRet
EndIf
Next

Return SetError(1, 0, $aRet)
EndFunc

смотрю уже было )


можно вообще взять весь список существующих окон и найти среди них нужное.
Подробней опиши какое окно необходимо.

Пример поиска всех окон процесса:
Opt('MustDeclareVars', 1)
Opt('TrayIconDebug', 1)
Opt('TrayIconHide', 0)

#include <Array.au3>

Local $iPID, $aWin
Local $sProcessName = 'Skype.exe' ; Имя процесса, окна которого необходимо найти
If NOT ProcessExists($sProcessName) Then Exit MsgBox(48, 'Поиск окна', 'Процесс "' & $sProcessName & '" не запущен')

$aWin = _ProcessGetWindow($sProcessName) ; Поиск всех имеющихся окон
;~ $aWin = _ProcessGetWindow($sProcessName, 1) ; Поиск только отображаемых окон
If NOT @error Then
_ArrayDisplay($aWin, 'Поиск окон процесса "' & $sProcessName & '"')
Else
MsgBox(48, 'Поиск окна', 'Окна не найдены')
EndIf

Func _ProcessGetWindow($sProcessName, $fOnlyVisible=0)
Local $iPID, $aWinList = WinList()
Local $aRet[1][2]
$aRet[0][0] = 0

If IsString($sProcessName) Then $iPID = ProcessExists($sProcessName)

For $i = 1 To UBound($aWinList)-1
If WinGetProcess($aWinList[$i][1]) = $iPID Then
If $fOnlyVisible AND NOT BitAnd(WinGetState($aWinList[$i][1]), 2) Then ContinueLoop

$aRet[0][0] += 1
ReDim $aRet[$aRet[0][0]+1][2]

$aRet[$aRet[0][0]][0] = $aWinList[$i][0] ;Title
$aRet[$aRet[0][0]][1] = $aWinList[$i][1] ;WinHandle
EndIf
Next

If $aRet[0][0] Then Return SetError(0, 0, $aRet)
Return SetError(1, 0, $aRet)
EndFunc




© OSzone.net 2001-2012