Показать полную графическую версию : [решено] Получить Handle будущего процесса.
Привет. Такая задача.
Нужно получить Handle окна, процесса, который ещё не запущен.
Я понимаю, что у нас нет машины времени, но должна же быть какая-то уловка.
В чём конкретно проблема.
Проблема в том, что неизвестно какое будет запущено приложение с помощью RUN, которое, как известно, возвращает PID.
PID - это уже что-то.
Но мне нужен Handle .
И соответственно, абсолютно неизвестен ни класс, ни заголовок, ни текст.
Как можно получить в такой ситуации Handle?
; Run('calc')
; Run('regedit')
Run('notepad')
local $hWnd = WinWaitActive('', '')
MsgBox(0, '111', $hWnd)
WinActivate($hWnd)
Нужно получить Handle окна, процесса, который ещё не запущен.
Я понимаю, что у нас нет машины времени, но должна же быть какая-то уловка. »
Нельзя. Никак. Совсем. Вы его никак не можете предсказать до.
Проблема в том, что неизвестно какое будет запущено приложение с помощью RUN, которое, как известно, возвращает PID.
PID - это уже что-то. »
Это не «уже что-то», а всё, что есть. И этого достаточно. По PID Вы можете получить как Handle главного окна, буде таковое, так и по списку всех окон определить, какие из них относятся к процессу. И никаких WinWaitActive.
Ну, предположим даже, что Вы получили хэндл Вашим способом. Что дальше? Что Вы с ним собираетесь делать?
Я хочу сразу активировать это окно на передний план.
Как мне получить хэндл?
Атос, опишите всю задачу.
Вот вся задача.
Запустить процесс, и сразу активировать его окно.
; Run('calc')
; Run('regedit')
Run('notepad')
local $hWnd = WinWaitActive('', '')
MsgBox(0, '111', $hWnd)
WinActivate($hWnd)
Атос, так по умолчанию окно и так становится окном переднего плана и получает фокус. У Вас разве не так?
А так — смотрите FAQ: FAQ - AutoIt Wiki: How can I get a window handle when all I have is a PID? (https://www.autoitscript.com/wiki/FAQ#How_can_I_get_a_window_handle_when_all_I_have_is_a_PID.3F)
Становится. А вдруг, мне хэндл позже понадобится.
А вдруг, мне хэндл позже понадобится. »
Ну так получитие его по 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
Creat0R, вот это мастерская функция. Спс.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.