Что нового

Что делает скрипт когда видет 10 окон с одинаковым названием?

Art4D

Новичок
Сообщения
22
Репутация
3
Что будет делать скрипт из этой темы? http://autoit-script.ru/index.php?topic=20587.0
Возьмет случайное окно или будет по всем искать?
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
Что он будет делать проверить очень просто.
Но если нужно избежать случайностей, то нужно обращаться к окну по его хендлу
 

uritalex

Новичок
Сообщения
197
Репутация
3
Будет работать с тем окном с которого снял хендл вот этим кодом
Код:
$hWnd = WinGetHandle("GTA:SA:MP")
 
Автор
A

Art4D

Новичок
Сообщения
22
Репутация
3
uritalex сказал(а):
Будет работать с тем окном с которого снял хендл вот этим кодом
Код:
$hWnd = WinGetHandle("GTA:SA:MP")
дак, у меня 10 оконс с этим хендлом! возьмет 1 случайное, да?
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Art4D [?]
дак, у меня 10 оконс с этим хендлом! возьмет 1 случайное, да?
Первое окно по Z-очереди.

Для получения всех окон используйте:
Код:
WinList
 

Skif_off

Знающий
Сообщения
173
Репутация
12
firex
Что такое Z-очередь? Всегда думал, что в таких случаях берётся последнее активное окно.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724

Skif_off

Знающий
Сообщения
173
Репутация
12
Yashied
Спасибо, гугл с запросом "z-очередь" выдал хлам. Получается почти то же самое - первое окно в Z-последовательности и будет последним активным?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Skif_off, не совсем так. Окна могут быть и дочерние, и TOPMOST. В идеале, если мы имеем 10 одинаковых окон, то первое будет активное (если есть).
 

Anna

Новичок
Сообщения
119
Репутация
2
Есть три окна с одинаковым именем.
Есть скрипт который работает с окном, находя его по имени.
Как сделать, чтобы три запущенные копии скрипта, работали каждый со своим окном.

Получила список окон функцией WinList, а как сообщить скрипту №2 что скрипт№1 уже работает с окном №1, чтобы тот начинал работу с окном №2 а не №1.
 
A

Alofa

Гость
Как вариант: запускайте программу, окно которой хотите захватить, вашим скриптом. Тогда та программа будет дочерней к процессу вашего скрипта и через PID её процесса узнаете дескриптор окна.
 

Anna

Новичок
Сообщения
119
Репутация
2
Спасибо, но программы- браузеры, могут быть разные.
Три окна, это одна страница в интернете, открыта трижды.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Anna
1) Вы можете создавать именованные, глобальные объекты (индикаторы), которые будут сигнализировать о занятости окна.
2) Помещать в USERDATA окна pid процесса(скрипта), которым оно занято. (не рекомендую)


На счет первого изучайте следующие функции:
Код:
_WinAPI_CreateEvent
_WinAPI_CreateMutex
_WinAPI_CreateSemaphore


На счет второго:
Код:
#Include <WinAPIEx.au3>

Func _CaptureWindow($hWnd) ; Захватить окно
	Local $fState
	; ---
	$fState = _CheckWindow($hWnd)
	If Not $fState Then _
		_WinAPI_SetWindowLong($hWnd, $GWL_USERDATA, @AutoItPID)
	; ---
	Return (Not $fState)
EndFunc

Func _ReleaseWindow($hWnd, $fCheckOwner = False) ; Освободить окно
	Local $fState = True
	; ---
	If $fCheckOwner Then _
		$fState = (_CheckWindow($hWnd) = @AutoItPID)
	; *
	If $fState Then _
		_WinAPI_SetWindowLong($hWnd, $GWL_USERDATA, 0)
	; ---
	Return $fState
EndFunc

Func _CheckWindow($hWnd) ; Проверить не занято ли окно
	Local $iPID
	; ---
	$iPID = _WinAPI_GetWindowLong($hWnd, $GWL_USERDATA)
	If $iPID And ProcessExists($iPID) Then _
		Return $iPID
	; ---
	Return False
EndFunc
 

Anna

Новичок
Сообщения
119
Репутация
2
firex
Спасибо, с функцией создания и работы с глобальной переменной “семафор” знакома, но в другом языке. Синтаксис немного другой поэтому напишу словами. Делала примерно следующее, если нет переменной “семафор” то создать,
Если семафор=1, выйти, если семафор=0 то поднять семафор, работать, сбросить семафор.
Но это была работа с одним окном разных роботов.
А здесь нужно создавать три семафора?
Скрипт№1 захватит окно с именем “dsa”, поднимет семафор1 , скрипт№2 видит что окно захвачено, захватит следующее окно с именем “dsa”, создаст семафор2, поднимет его, но пока второй скрипт не поднял семафор2, скрипт №1 может успеть поработать и во втором окне. Не соображу как это должно работать.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Anna
Вы называйте семафоры видом: "MySemaphore_0xXXXXXXXX", где 0xXXXXXXXX - Handle окна.

Да, можно прямо так:
Код:
$sSemaphoreName = 'MySemaphore_' & $hWnd


И организуйте проверку в стиле из моего первого ответа вам:
-занято ли окно
-освободить окно
-занять окно
 

Anna

Новичок
Сообщения
119
Репутация
2
firex
А что помешает скрипту №1, захватить второе окно с таким же именем “dsa” ?
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Anna
У каждого окна дескриптор (hWnd) уникальный. Захватит то, которое вы прикажете, а остальные скрипты уже не смогут его взять.
 

Anna

Новичок
Сообщения
119
Репутация
2
firex сказал(а):
а остальные скрипты уже не смогут его взять.
Это понятно, но как мне выбрать только одно окно из трёх с одинаковым именем?
К примеру, обновляю окно “dsa”
Код:
Func _test_func()
WinWait("dsa")
If Not WinActive("dsa") Then WinActivate("dsa")
WinWaitActive("dsa")
Send("{F5}")               
EndFunc

А у меня их, 3 открыто,
нужно чтобы каждая копия скрипта обновляла своё окно.
Покажите, пожалуйста.
 
Верх