Что нового

потеря фокуса окна и как предотвратить это

running-frag

why me?
Сообщения
441
Репутация
60
Вопрос прост. Как не дать потерять фокус окна. Окно не "наше". Т.е. созданно не средствами автоита (допустим клиент какой то программы\игры).
Искал в хэлпе, ненашёл подходящих функций. :(

PS: откуда родился вопрос - когда запущен скрипт и в этом время вылазит PopUp такой нибудь, то фокус меняется и скрипт не работает корректно
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
а если мы прыгаем по окнам в скрипте? т.е. получается переключаемся на окно выставляем WinSetOnTop(), делаем что надо, меняем WinSetOnTop, переключаем окно и так далее... ?
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Код:
Run('calc.exe')
ProcessWait('calc.exe')

$hHandle = WinGetHandle('[CLASS:SciCalc]')

While WinExists($hHandle)
    If WinActive($hHandle) <> 1 Then
        WinActivate($hHandle)
	EndIf
Wend


Код:
#Include <WinAPIEx.au3>

Run('calc.exe')
ProcessWait('calc.exe')

$hHandle = WinGetHandle('[CLASS:SciCalc]')

While WinExists($hHandle)
    If WinActive($hHandle) <> 1 Then
		_WinAPI_SetForegroundWindow($hHandle)
	EndIf
Wend
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Viktor1703,
ИМХО, так корректнее.
Код:
Run('calc.exe')
$hHandle = WinWait('[CLASS:SciCalc]', '', 5)

While WinExists($hHandle)
    If Not WinActive($hHandle) Then
        WinActivate($hHandle)
    EndIf
	Sleep(50)
Wend
Или через AdlibRegister().
 

SyDr

Сидра
Сообщения
651
Репутация
158
WinSetOnTop к активности окна не имеет никакого отношения же.

Смотри:
Код:
WinActivate() ; следует активировать окно каждый раз, когда хочешь с ним работать (если оно ещё не активно)
; и, если используешь Send, попробуй
SendKeepActive()
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
цикл не прокатит, а как же мы будем выполнять остальные функции то? я пытаюсь избежать "потерю фокусам во время выполнения функции" (по середине) то что можно проверять до и после функций это само собой
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
может я чего то не понимаю но как AdLibRegister и цикл держащий handle поможет?

ну допустим мы запускаем через AdLibregister() функцию, где в While держит хэндл, но ребят там же выхода из цикла нет, т.е. это простое зацикливание (один раз запускается и "вешаемся на этом цикле"), но если даже мы будем делать с интервалом проверки (где не будет цикла, а одиночкая прорвекра на активность нужного окна), где гарантия того что (по закону подлости) что за вот эти "5" мс фокус не сменится и функция не поломается (допустим берём цвет пикселя в активном окне)

поэтому думается мне что это не самый надёжный вариант, есть ещё мысли как это обыграть?
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
А зачем в AdlibRegister() ставить цикл While Wend?

Код:
Run('calc.exe')
Global $hHandle = WinWait('[CLASS:SciCalc]', '', 5)

;~ Код

AdlibRegister('Activate', 50)

;~ Код

Func Activate()
	If Not WinActive($hHandle) Then
        WinActivate($hHandle)
    EndIf
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
running-frag [?]
допустим берём цвет пикселя в активном окне)
Ну и проверяйте окно на активность перед этим и активируйте его, если надо.
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
тогда получится очень много проверок, я надеялся на функцию\опцию которая сама держит окно в фокусе :(
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Пример с AdlibResister() выше, будет Вам держать окно самостоятельно не мешая работе скрипта
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
Viktor1703 [?]
Пример с AdlibResister() выше, будет Вам держать окно самостоятельно не мешая работе скрипта
ок, тогда задам другой вопрос, AdLibregister() выполняется "параллельно" основному скрипту? либо она "приостанавливает его" выполняет себя и после "продолжает основной с места пред. остановки"?
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Приостанавливает :smile:

Из справки:

Обработчик должен быть простым, поскольку может вызываться достаточно часто. При его запуске основной скрипт приостанавливает свою работу, поэтому параметр time следует тщательно подбирать, во избежании перегрузки ЦП.
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
running-frag [?]
где гарантия того что (по закону подлости) что за вот эти "5" мс фокус не сменится и функция не поломается (допустим берём цвет пикселя в активном окне)
...

в общем проще делать проверку в первой строке функции, а в конце проверять удержался ли фокус, если нет, делаем функцию снова

всем спс за помощь :smile:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
running-frag

Предупреждение За нарушение общих правил (пункт В.8):
Так как эта конференция называется "Русское сообщество AutoIt", язык общения на ней - Русский. Названия фирм или программных продуктов, аббревиатуры и т.д. должны быть написаны так, как они пишутся в оригинале, например не следует писать УСБ вместо USB. На форуме крайне не рекомендуется намеренно искажать русский язык и использовать "сетевой жаргон" на подобии "Аффтар выпей йадау!".


С уважением, ваш Глобальный модератор.
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
Вроде всё поправил. Если речь шла о "эдлиб" и "OnTop".
 
Верх