Что нового

[Окна, Диалоги] Работа с окнами

iwak

Новичок
Сообщения
28
Репутация
0
Здравствуйте. Помогите реализовать следующую задачу.
У меня есть несколько скриптов, которые одновременно выполняют различные действия в разных окнах. Но время от времени им требуется давать фокус (WinActivate). Проблема в том, что скрипты воруют фокус у друг друга, а нужно чтобы скрипты не могли активировать окно с которым они работают до тех пор, пока со стороны текущего работающего скрипта не будет команды деактивировать окно с которым он работает.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
iwak,
Смотрите пример к функции _WinAPI_CreateSemaphore().
 
Автор
I

iwak

Новичок
Сообщения
28
Репутация
0
Так и не разобрался с этим примером. Ничего не получилось. Может есть другой пример или способ это реализовать?
Очень нужна такая возможность в скриптах.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
iwak [?]
способ это реализовать
Открываете файл в монопольном доступе и работаете. По завершении работы - закрываете файл. Другие скрипты ждут своей очереди на открытие этого же файла, чтобы начать работать. Пример скомпилируйте и запустите несколько копий - при закрытии одного MsgBox появится следующий и т.д.
Код:
#include <WinAPI.au3>
$p = ProcessList(@ScriptName)
While Sleep(350)
  Do
    Sleep(100)
    $f = _WinAPI_CreateFile("lock.txt", 3)
  Until $f
  MsgBox(0, "", "Работаю : копия " & $p[0][0])
  _WinAPI_CloseHandle($f)
WEnd
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
по поводу семафора
два скрипта. скомпилируйте и запустите оба
первый
Код:
#include <WinAPI.au3>
#include <WinAPIProc.au3>
$fo = FileOpen('1.txt',2)
FileClose($fo)
ShellExecute('1.txt')
$i = 0
While 1
	$hSemaphore = _WinAPI_CreateSemaphore('MySemaphore', 1, 1)
	_WinAPI_WaitForSingleObject($hSemaphore)
	WinActivate('1 — Блокнот')
	ControlSetText('1 — Блокнот', '', 'Edit1', 'Работает первый, второй ждет' & $i)
	$i += 1
	Sleep(2000)
	ControlSetText('1 — Блокнот', '', 'Edit1', '')
	_WinAPI_ReleaseSemaphore($hSemaphore)
	_WinAPI_CloseHandle($hSemaphore)
WEnd

второй
Код:
#include <WinAPI.au3>
#include <WinAPIProc.au3>
$fo = FileOpen('2.txt',2)
FileClose($fo)
ShellExecute('2.txt')
$i = 0
While 1
	$hSemaphore = _WinAPI_CreateSemaphore('MySemaphore', 1, 1)
	_WinAPI_WaitForSingleObject($hSemaphore)
	WinActivate('2 — Блокнот')
	ControlSetText('2 — Блокнот', '', 'Edit1', 'Работает второй, первый ждет' & $i)
	$i += 1
	Sleep(2000)
	ControlSetText('2 — Блокнот', '', 'Edit1', '')
	_WinAPI_ReleaseSemaphore($hSemaphore)
	_WinAPI_CloseHandle($hSemaphore)
WEnd

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


Добавлено:
Сообщение автоматически объединено:

можно по другому
три скрипта
первый один раз при запуске активирует свое окно и работает в нем, отработав, активирует окно для второго скрипта, а сам ждет активности своего окна
второй скрипт "увидев", что его окно активно отрабатывает в нем и делает активным окно для третьего скрипта, а сам ждет активности своего окна
третий скрипт, отработав в своем окне делает активным окно для первого скрипта.
так по кругу и будет все работать
очередность можно выбирать рандомно.
вобщем, способов можно придумать несколько
 
Автор
I

iwak

Новичок
Сообщения
28
Репутация
0
InnI, joiner, Спасибо. Буду разбираться.
 
Верх