Показать полную графическую версию : [решено] Поиск нужного окна
Здравствуйте, есть такая ситуация.
Есть окно, которое может открыться через 1 мин, а может вообще не открыться. в случае если оно откроется мне нужно его найти, собственно проблема в чем:
1) Окно не имеет постоянного названия(то есть окно может быть на множестве языков), по этому по заголовку искать нельзя.
2)
>>>> Window <<<<
Title: Окно
Class: #32770
Собственно и по классу нельзя искать...
Есть положительный момент, есть у него процесс который я могу найти, но как по процесу найти открытое окно (заголовок) мне не ясно.
Подскажите плз что делать в данной ситуацие ? :(
Заранее благодарен.
http://www.autoitscript.com/forum/index.php?showtopic=85167&view=findpost&p=610777
а как по названию получить PID ?
чет не могу в оффлайн доке найти... :)
Yashied, тебе большое спасибо :)
а как по названию получить PID ? »
ProcessExists() возвращает PID.
Знаете что странно ? о_О
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)
Подобная фигня возвращает имя активного окна :( а не открытого окна этого процесса :(
Подобная фигня возвращает имя активного окна а не открытого окна этого процесса »
Насколько я понял, эта фигня (т.е _WinGetByPid()) возвращает массив, состоящий из заголовков (имен) окон, связанных с данным процессом. Первый элемент массива (т.е нулевой, в твоем случае - $r[0]) содержит полное количество окон (т.е количество элементов в массиве, начиная с 1).
For $i = 1 To $r[0]
...
Next
Если твоя программа имеет только одно окно (активное или нет - не имеет особого значения), тогда
$sTitle = $r[1]
$hWnd = WinGetHandle($r[1])
Зная $hWnd, ты можешь колдовать дальше.
Я проверил эту функцию на "Блокноте", все работает отлично!
пример поиска окна по процессу:
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.