PDA

Показать полную графическую версию : [решено] Получить Handle будущего процесса.


Атос
31-07-2017, 12:01
Привет. Такая задача.

Нужно получить 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
Нужно получить Handle окна, процесса, который ещё не запущен.
Я понимаю, что у нас нет машины времени, но должна же быть какая-то уловка. »
Нельзя. Никак. Совсем. Вы его никак не можете предсказать до.

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


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

Атос
31-07-2017, 13:48
Я хочу сразу активировать это окно на передний план.

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

Iska
31-07-2017, 14:11
Атос, опишите всю задачу.

Атос
31-07-2017, 14:40
Вот вся задача.
Запустить процесс, и сразу активировать его окно.


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

Iska
31-07-2017, 15:38
Атос, так по умолчанию окно и так становится окном переднего плана и получает фокус. У Вас разве не так?

А так — смотрите 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)

Атос
31-07-2017, 15:57
Становится. А вдруг, мне хэндл позже понадобится.

Creat0R
31-07-2017, 20:21
А вдруг, мне хэндл позже понадобится. »
Ну так получитие его по 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
Creat0R, вот это мастерская функция. Спс.




© OSzone.net 2001-2012