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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Получить Handle будущего процесса. (http://forum.oszone.net/showthread.php?t=328743)

Атос 31-07-2017 12:01 2755143

Получить Handle будущего процесса.
 
Привет. Такая задача.

Нужно получить Handle окна, процесса, который ещё не запущен.
Я понимаю, что у нас нет машины времени, но должна же быть какая-то уловка.

В чём конкретно проблема.
Проблема в том, что неизвестно какое будет запущено приложение с помощью RUN, которое, как известно, возвращает PID.
PID - это уже что-то.
Но мне нужен Handle .
И соответственно, абсолютно неизвестен ни класс, ни заголовок, ни текст.

Как можно получить в такой ситуации Handle?

Код:

; Run('calc')
; Run('regedit')
Run('notepad')
local $hWnd = WinWaitActive('', '')
MsgBox(0, '111', $hWnd)
WinActivate($hWnd)


Iska 31-07-2017 12:53 2755164

Цитата:

Цитата Атос
Нужно получить Handle окна, процесса, который ещё не запущен.
Я понимаю, что у нас нет машины времени, но должна же быть какая-то уловка. »

Нельзя. Никак. Совсем. Вы его никак не можете предсказать до.

Цитата:

Цитата Атос
Проблема в том, что неизвестно какое будет запущено приложение с помощью RUN, которое, как известно, возвращает PID.
PID - это уже что-то. »

Это не «уже что-то», а всё, что есть. И этого достаточно. По PID Вы можете получить как Handle главного окна, буде таковое, так и по списку всех окон определить, какие из них относятся к процессу. И никаких WinWaitActive.


Ну, предположим даже, что Вы получили хэндл Вашим способом. Что дальше? Что Вы с ним собираетесь делать?

Атос 31-07-2017 13:48 2755174

Я хочу сразу активировать это окно на передний план.

Как мне получить хэндл?

Iska 31-07-2017 14:11 2755182

Атос, опишите всю задачу.

Атос 31-07-2017 14:40 2755190

Вот вся задача.
Запустить процесс, и сразу активировать его окно.


Код:

; Run('calc')
; Run('regedit')
Run('notepad')
local $hWnd = WinWaitActive('', '')
MsgBox(0, '111', $hWnd)
WinActivate($hWnd)


Iska 31-07-2017 15:38 2755204

Атос, так по умолчанию окно и так становится окном переднего плана и получает фокус. У Вас разве не так?

А так — смотрите FAQ: FAQ - AutoIt Wiki: How can I get a window handle when all I have is a PID?

Атос 31-07-2017 15:57 2755208

Становится. А вдруг, мне хэндл позже понадобится.

Creat0R 31-07-2017 20:21 2755259

Цитата:

Цитата Атос
А вдруг, мне хэндл позже понадобится. »

Ну так получитие его по PID и храните в переменной.

Код:

$iPID = Run('notepad.exe')
$hWindow = _WinWaitByPID($iPID, 3)

ConsoleWrite($hWindow & @CRLF)
ConsoleWrite(WinGetTitle($hWindow) & @CRLF)

Func _WinWaitByPID($iPID, $iTimeout = 0, $bOnlyVisible = True)
        Local $iTimer = TimerInit()
        Local $aWinList
       
        While 1
                $aWinList = WinList()
               
                For $i = 1 To UBound($aWinList) - 1
                        If $aWinList[$i][0] <> '' And WinGetProcess($aWinList[$i][1]) = $iPID Then
                                If Not $bOnlyVisible Or ($bOnlyVisible And BitAND(WinGetState($aWinList[$i][1]), 2) = 2) Then
                                        Return $aWinList[$i][1]
                                EndIf
                        EndIf
                Next
               
                If $iTimeout And (TimerDiff($iTimer) >= ($iTimeout * 1000)) Then
                        Return -1
                EndIf
               
                Sleep(10)
        WEnd
       
        Return 0
EndFunc


Атос 01-08-2017 09:06 2755324

Creat0R, вот это мастерская функция. Спс.


Время: 03:02.

Время: 03:02.
© OSzone.net 2001-