Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Поиск нужного окна (http://forum.oszone.net/showthread.php?t=145422)

DjinnKo 17-07-2009 12:40 1170432

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

>>>> Window <<<<
Title: Окно
Class: #32770
Собственно и по классу нельзя искать...

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

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

Yashied 17-07-2009 14:15 1170540

http://www.autoitscript.com/forum/in...dpost&p=610777

DjinnKo 17-07-2009 14:27 1170552

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

Yashied 17-07-2009 14:39 1170563

Цитата:

Цитата DjinnKo
а как по названию получить PID ? »

ProcessExists() возвращает PID.

DjinnKo 17-07-2009 16:21 1170654

Знаете что странно ? о_О
Код:

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 1170832

Цитата:

Цитата DjinnKo
Подобная фигня возвращает имя активного окна а не открытого окна этого процесса »

Насколько я понял, эта фигня (т.е _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 1170897

пример поиска окна по процессу:
читать дальше »

Код:

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



Время: 15:56.

Время: 15:56.
© OSzone.net 2001-