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

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

Ответить
Настройки темы
[решено] Получить Handle будущего процесса.

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


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

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


Привет. Такая задача.

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

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

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

Код: Выделить весь код
; Run('calc')
; Run('regedit')
Run('notepad')
local $hWnd = WinWaitActive('', '')
MsgBox(0, '111', $hWnd)
WinActivate($hWnd)

Отправлено: 12:01, 31-07-2017

 

Ветеран


Contributor


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

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


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

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


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

Отправлено: 12:53, 31-07-2017 | #2



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

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


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


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

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


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

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

Отправлено: 13:48, 31-07-2017 | #3


Ветеран


Contributor


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

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


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

Отправлено: 14:11, 31-07-2017 | #4


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


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

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


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


Код: Выделить весь код
; Run('calc')
; Run('regedit')
Run('notepad')
local $hWnd = WinWaitActive('', '')
MsgBox(0, '111', $hWnd)
WinActivate($hWnd)

Отправлено: 14:40, 31-07-2017 | #5


Ветеран


Contributor


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

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


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

А так — смотрите FAQ: FAQ - AutoIt Wiki: How can I get a window handle when all I have is a PID?
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:38, 31-07-2017 | #6


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


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

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


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

Отправлено: 15:57, 31-07-2017 | #7


Аватара для Creat0R

Must AutoIt


Moderator


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

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


Цитата Атос:
А вдруг, мне хэндл позже понадобится. »
Ну так получитие его по 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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

Русское сообщество AutoIt | CreatoR's Lab | Opera AC Community


Последний раз редактировалось Creat0R, 31-07-2017 в 20:57.

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

Отправлено: 20:21, 31-07-2017 | #8


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


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

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


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

Отправлено: 09:06, 01-08-2017 | #9



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
PowerShell - [блог] Получение handle Name Kazun Скриптовые языки администрирования Windows 8 11-04-2017 17:52
C/C++ - Поток закрывает свой handle SmallGod Программирование и базы данных 1 06-02-2011 15:10
Узнать controlID по Handle san45 AutoIt 3 13-05-2009 22:23
Не удалось получить доступ или установить принадлежность процесса? GifuN Microsoft Windows NT/2000/2003 0 14-01-2008 14:03
ThreadId -> Handle Andreich Программирование и базы данных 4 06-08-2004 14:31




 
Переход