[решено] Поиск нужного окна

Ответить
Аватара пользователя
DjinnKo

[решено] Поиск нужного окна

Сообщение DjinnKo »

Здравствуйте, есть такая ситуация.

Есть окно, которое может открыться через 1 мин, а может вообще не открыться. в случае если оно откроется мне нужно его найти, собственно проблема в чем:

1) Окно не имеет постоянного названия(то есть окно может быть на множестве языков), по этому по заголовку искать нельзя.

2)


Цитата:



>>>> Window
Аватара пользователя
DjinnKo

Re: [решено] Поиск нужного окна

Сообщение DjinnKo »

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

чет не могу в оффлайн доке найти... Изображение

Yashied, тебе большое спасибо Изображение
Аватара пользователя
DjinnKo

Re: [решено] Поиск нужного окна

Сообщение DjinnKo »

Цитата DjinnKo:



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




ProcessExists() возвращает PID.
Аватара пользователя
DjinnKo

Re: [решено] Поиск нужного окна

Сообщение DjinnKo »

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



Код:

Код: Выделить всё

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

Re: [решено] Поиск нужного окна

Сообщение Yashied »

Цитата DjinnKo:



Подобная фигня возвращает имя активного окна а не открытого окна этого процесса
[решено] Поиск нужного окна




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



For $i = 1 To $r[0]

...

Next




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



$sTitle = $r[1]

$hWnd = WinGetHandle($r[1])




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



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

Re: [решено] Поиск нужного окна

Сообщение proxy »

пример поиска окна по процессу:


читать дальше »






Код:

Код: Выделить всё

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 
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
Ответить

Вернуться в «AutoIt»