Что нового

[Окна / Диалоги] Пример получения указателя окна по его PID

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
156
AutoIt: 3.3.0.0
Версия: 1
Категория: Окна и диалоги
Описание: Пример получения указателя окна, и дальнейшего упралвения им, по его PID
Код/Пример:
Код:
Local $iPid1, $iPid2, $iHwd1, $iHwd2

; запуск блокнота №1, PID окна записывается в переменную $iPid1
$iPid1 = Run('notepad.exe')
; получение указателя на окно блокнота №1 по PID окна $iPid1
While 1
    $iHwd1 = _ProcessGetWindow($iPid1)
    If IsHWnd($iHwd1) Then ExitLoop
WEnd
; ожидание появления окна блокнота №1
WinWait($iHwd1)

; запуск блокнота №1, PID окна записывается в переменную $iPid1
$iPid2 = Run('notepad.exe')
; получение указателя на окно блокнота №1 по PID окна $iPid1
While 1
    $iHwd2 = _ProcessGetWindow($iPid2)
    If IsHWnd($iHwd2) Then ExitLoop
WEnd
; ожидание появления окна блокнота №1
WinWait($iHwd2)

; ---------------------------------
; теперь известны указатели обоих окон, далее можно легко работать непосредственны с каждым из них не перепутав

; перемещение окно блокнота №1
WinMove($iHwd1, '', 200, 200, 400, 400)
; перемещение окно блокнота №2
WinMove($iHwd2, '', 280, 280, 400, 400)

; активизация окна блокнота №1
WinActivate($iHwd1)
; вставка текста в окно блокнота №1
ControlSetText($iHwd1, '', 'Edit1', 'Окно №1')
Sleep(2000)

; активизация окна блокнота №2
WinActivate($iHwd2)
; вставка текста в окно блокнота №2
ControlSetText($iHwd2, '', 'Edit1', 'Окно №2')
Sleep(2000)

; ---------------------------------
;закрытие окна блокнота №1
WinClose($iHwd1)
;закрытие окна блокнота №1
WinClose($iHwd2)


; ---------------------------------
; функция получения загодовка и указателя окна по его PID
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
Файл: ZIP (AU3, EXE) 270 kb
Источник: `p r o x y
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
У меня это не работает. Открывается один блокнот и дальше ничего не делается.
Может я что-то неправильно делаю?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
У меня тоже открывается 1 блокнот и ... зависание. Плюс почти на 100% грузит процессор. Может это из-за того, что у меня Akelpad вместо Notepad?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 160
Репутация
2 329
Kaster [?]
первое сообщение ведь тоже ты писал
Он видимо забыл про него :D

madmasles [?]
Может я что-то неправильно делаю?
А как мы можем это знать, ты ведь не написал что ты делаешь :laugh:

[?]
Может это из-за того, что у меня Akelpad вместо Notepad?
Тогда каким образом всё же запускается блокнот? :-\
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Kaster
CreatoR

Довольно долго я не отвечал, извините, но... лучше поздно, чем никогда.

Дело в том, что я использую аддон Akelpad, так что Notepad у меня отсутствует, но в процессах при открытии блокнота висят оба (и Akelpad.exe, и Notepad.exe). И открыть блокнот можно любым из них, но открывается Akelpad. У него другие параметры, поэтому (я так думаю) практически все примеры с Notepad у меня не работают. Переустановлю систему со штатным Notepad и потом отпишусь.


PS
Все работает. :smile:
 
Верх