Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Поиск нужного окна

Ответить
Настройки темы
[решено] Поиск нужного окна

Новый участник


Сообщения: 25
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

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

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

Отправлено: 12:40, 17-07-2009

 

Аватара для Yashied

Старожил


Сообщения: 206
Благодарности: 88

Профиль | Отправить PM | Цитировать


http://www.autoitscript.com/forum/in...dpost&p=610777
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:15, 17-07-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 25
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

Отправлено: 14:27, 17-07-2009 | #3


Аватара для Yashied

Старожил


Сообщения: 206
Благодарности: 88

Профиль | Отправить PM | Цитировать


Цитата DjinnKo:
а как по названию получить PID ? »
ProcessExists() возвращает PID.

Отправлено: 14:39, 17-07-2009 | #4


Новый участник


Сообщения: 25
Благодарности: 1

Профиль | Отправить PM | Цитировать


Знаете что странно ? о_О
Код: Выделить весь код
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)
Подобная фигня возвращает имя активного окна а не открытого окна этого процесса

Отправлено: 16:21, 17-07-2009 | #5


Аватара для Yashied

Старожил


Сообщения: 206
Благодарности: 88

Профиль | Отправить PM | Цитировать


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

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


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

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


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

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

Отправлено: 19:58, 17-07-2009 | #6


Аватара для proxy

Старожил


Сообщения: 460
Благодарности: 152

Профиль | Отправить PM | Цитировать


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

Код: Выделить весь код
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

-------
Мысли-читатель сломался, может подробней расскажите?
А где исходный код? Или мы стихи обсуждаем?! )) Настройки темы > Решено ?


Последний раз редактировалось proxy, 17-07-2009 в 21:28.

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:08, 17-07-2009 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Поиск нужного окна

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Как организовать поиск нужного диска и запуск с него приложения? Nun-Nun Скриптовые языки администрирования Windows 16 28-05-2009 22:12
[решено] Как найти и прописать в реестре запуск нужного файла? Pozia AutoIt 12 12-03-2009 23:38
[решено] Поиск нужного текста в html коде страницы ph0en1x AutoIt 8 16-02-2009 02:38
Открытие окна нужного размера darksmoke Вебмастеру 1 10-09-2008 10:04
загрузка нужного шрифта (CSS 2) Underson Вебмастеру 7 18-03-2006 13:30




 
Переход