1 (изменено: cyberlife8, 2013-02-06 00:01:04)

Тема: AHK: Можно ли отправлять команды в "неактивные окна" ?

Здравствуйте всем !
Есть у меня один скрипт (спасибо за помощь ypppu и creature.ws), который закрывает некоторые окошки и посылает "СontrolClick" в определённые окна под курсором, то есть, если окно

 (ahk_class GFX_INT_DLG_WINDOW_GAME)

то

u:: 
ControlClick, x152  y338

а если окно

(WinActive ahk_class #32770)

тогда

u::
ControlClick, x208 y330
Sleep 10,
ControlClick, x208 y330
Sleep 10,
ControlClick, x213 y294
return

Всё работает хорошо, но только если открываю больше 5 окон, начинаются небольшие тормоза и окна не успевают "подниматься наверх" и соответственно controlClick в них не посылается.
Можно ли сделать так, чтобы команды посылались без активации окна ?

Вот сам скрипт:   

#Persistent

SetTitleMatchMode, 1

Loop
{
    Loop, 4
    {
    MouseGetPos, , , Win
    If(Win != PrevWin)
        {
        PrevWin := Win
        WinActivate, ahk_id %Win%
        }   
    Sleep, 10
    }
GoSub, AntiIdle
}

AntiIdle:
    WinExist("A")
    WinGetTitle winTitle

    if (winTitle == "Player Still Active")
        ControlClick Yes

      else if (winTitle == "Are you sure?")
        ControlClick Check, 

    else if (winTitle == "User Message")
        ControlClick, x165 y149

 else if (winTitle == "Member Message")
        ControlClick, x167 y149

 else if (winTitle == "Choose your buy-in amount")
        ControlClick, x88 y452

else if (winTitle == "Auto Post Blinds")
        ControlClick, Close
Return


F11::Suspend
F10::Pause



#IfWinActive ahk_class GFX_INT_DLG_WINDOW_GAME

$u::
ControlClick, x152  y338
return


$m::
ControlClick, x20 y352
return

$j::
ControlClick, x234 y338
return

$k::
ControlClick, x196 y371
Sleep, 20
ControlClick, x311 y324
Return

$i::
ControlClick, x227 y373
Sleep, 20
ControlClick, x311 y324
Return

$o::
ControlClick, x261 y371
Sleep, 20
ControlClick, x311 y324
Return


#IfWinActive ahk_class #32770
   WinActivate 

$u::

ControlClick, x208 y330
Sleep 10,
ControlClick, x208 y330
Sleep 10,
ControlClick, x213 y294
return

$j::
ControlClick, x339 y295
return

$k::
ControlClick, x422 y314
Sleep 10,
ControlClick, x419 y294
return

$i::
ControlClick, x387 y313
Sleep 10,
ControlClick, x419 y294
return

$o::
ControlClick, x353 y313
Sleep 10,
ControlClick, x419 y294
return

$m::
ControlClick, x304 y340
return

2

Re: AHK: Можно ли отправлять команды в "неактивные окна" ?

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

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Можно ли отправлять команды в "неактивные окна" ?

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

Переоформил.

4

Re: AHK: Можно ли отправлять команды в "неактивные окна" ?

1. можно использовать winwaitactive после winactivate, но окна по-прежнему будут видны.
2. без активации окна можно сделать только через сложные штуки вроде PostMessage.

5

Re: AHK: Можно ли отправлять команды в "неактивные окна" ?

Не помогло, или я не правильно понял ?

#IfWinActive ahk_class GFX_INT_DLG_WINDOW_GAME
WinWaitActive, ahk_class GFX_INT_DLG_WINDOW_GAME, , 2

$u::
ControlClick, x152 y338
return

6

Re: AHK: Можно ли отправлять команды в "неактивные окна" ?

Да, вы неправильно поняли. Или просто не желаете разбираться, полагаясь на «помощь». Учитывая приложенные вами фрагменты кода, я считаю верным второе предположение.

Можно ли отправлять команды в "неактивные окна"

ControlClick и ControlSend отправляют нажатия и клики в неактивные окна. Не нужно использовать термин «команды» в этом контексте.

Код из первого сообщения сперва активирует окно под курсором, а после проверяет "а что это мы там активировали". Если нажатия и клики нужно отправлять в определённые окна независимо от того, являются ли они активными — достаточно:

#Persistent
SetTimer, AntiIdle, 300
return

AntiIdle:
    if WinExist("Player Still Active")
        ControlClick Yes

    if WinExist("Are you sure?")
        ControlClick Check

    if WinExist("User Message")
        ControlClick x165 y149

    if WinExist("Member Message")
        ControlClick x167 y149

    if WinExist("Choose your buy-in amount")
        ControlClick x88 y452

    if WinExist("Auto Post Blinds")
        ControlClick Close
    return

Функция WinExist() устанавливает «последнее найденное окно». Команда ControlClick расположенная после вызова WinExist() «кликает» в найденном окне.

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

#IfWinActive — директива. Место её расположения в коде не является началом подпрограммы. Директивы #if… влияют лишь на нижележащие горячие клавиши и строки автозамены. В справке, в соответствующей статье, об этом говорится.
Не нужно проявлять «чудеса эквилибристики» пытаясь «угадать» как из наличествующих команд сложить нужный скрипт. Посмотрите примеры в коллекции — там бредовых конструкций в коде нет, почитайте справку — там есть ответы на большинство вопросов.