Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Эмуляция ввода с клавиатуры или клик мышки на кнопку в неактивном окне (http://forum.oszone.net/showthread.php?t=133279)

Иск 27-02-2009 03:44 1050096

Эмуляция ввода с клавиатуры или клик мышки на кнопку в неактивном окне
 
В общем следующая проблема, решил вернуться к некогда заброшенному проекту, столкнулся со следующей проблемой. Имеем 2 абсолютно одинаковых окна (Title, Class одинаковые, различаются только положением и Handle ( что это такое?никак не разберусь...) одно активное, второе соответственно нет . Можно ли как-нибудь из активного посылать в неактивное нажатие клавиши, к примеру "{DELETE}" или зная координаты кнопки ( кнопка не как Class, а просто кусок окна, в Atoit Window Info никак не определяется) нажать на нее не активируя окно ? Если можно , примеры дайте, пожалуйста. Нашел инфу что через ControlSend можно как-то, но не знаю как заставить посылать именно в неактивное, не знаю как заставить различать активное от неактивного.... Заранее спасибо!

amel27 27-02-2009 05:07 1050112

Цитата:

Цитата Иск
Эмуляция ввода с клавиатуры или клик мышки на кнопку в неактивном окне »

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

Цитата:

Цитата Иск
через ControlSend можно как-то, но не знаю как заставить посылать именно в неактивное »

AFAIK если контрол нельзя идентифицировать, то ControlSend не поможет - только эмуляция

Иск 27-02-2009 13:32 1050408

Цитата:

Цитата amel27
гм.. не понял - "кликаньем мышкой" или нажатием клавиш можно воздействовать на "неактивное окно"?.. »

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

То есть, если окно нельзя идентифицировать, остается только посылать мышку в нужные координаты и кликать, делая тем самым неактивное окно активным? Больше никаких вариантов нет? Так и не понял что такое этот Handle (В Atoit Window Info 2 окна различаются только в этом параметре, который при каждом запуске меняется, но у двух окон всегда разный ) Может можно сделать идентификацию по этому параметру? К примеру гружу окно №1 ,считываю и записываю его Handle ( уж не знаю как, правда), потом гружу окно № 2, делаю тоже самое. Получится у меня 2 уникальных окна. Если я буду знать куда точно посылать текст, можно ли будет посылать в неактивное окно? В общем все это теория и наверно глупо со стороны смотрится :(

Creat0R 27-02-2009 19:56 1050745

Цитата:

Цитата Иск
Так и не понял что такое этот Handle »

Это идентификатор окна.

Цитата:

Цитата Иск
можно ли будет посылать в неактивное окно? »

Можно, проверять нужно через WinList + WinActive по хендлу, вот так примерно:

Код:

$aWinList = WinList("[CLASS:Тут класс окна]")

For $i = 1 To $aWinList[0][0]
    If Not WinActive($aWinList[$i][1]) Then
        ;Тут кликаем по кнопке

        WinActivate($aWinList[$i][1])
        _ControlClickEx($aWinList[$i][1], "", "Main", 150, 100) ;150x100 это координаты элемента (кнопки) в окне, см. с Au3InfoTool

        ExitLoop
    EndIf
Next

Func
_ControlClickEx($sTitle, $sText = "", $sButton = "Main", $iCtrl_X_Coord = 0, $iCtrl_Y_Coord = 0)
    Local $aWin_Pos = WinGetPos($sTitle, $sText)
    Local $aWin_ClientSize = WinGetClientSize($sTitle, $sText)

    Local $iBorder_Size = $aWin_Pos[2] - $aWin_ClientSize[0]
    Local $iCaption_Size = $aWin_Pos[3] - $aWin_ClientSize[1]

    Local $aOld_Mouse_Pos = MouseGetPos()

    MouseClick($sButton, $aWin_Pos[0] + $iCtrl_X_Coord + $iBorder_Size, $aWin_Pos[1] + $iCtrl_Y_Coord + $iCaption_Size, 1, 0)
    MouseMove($aOld_Mouse_Pos[0], $aOld_Mouse_Pos[1], 0)
EndFunc

Ещё см. эту тему.

amel27 28-02-2009 05:42 1051012

Цитата:

Цитата Иск
если окно нельзя идентифицировать, остается только посылать мышку в нужные координаты и кликать, делая тем самым неактивное окно активным? »

идентифицировать не "окно", а "контрол" - окно можно идентифицировать почти всегда, а при эмуляции кликов неактивное окно полюбому станет активным

Цитата:

Цитата Creat0R
проверять нужно через WinList + WinActive по хендлу, вот так примерно»

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

Creat0R 28-02-2009 12:30 1051144

amel27,
Цитата:

это если контрол неактивного окна видим на экране
Как я понял, в случае Иск'а он видим.

Цитата:

некоторые приложения первый клик используют только для активации окна, для нажатия на контрол приходится кликать дважды на одном месте
Да, было такое. Значит перед нажатием активируем окно (кликать два раза не лучший вариант, так как может действительно два раза по кнопке нажать). Подправил немного свой пример выше (также исправил там использование параметра $sButton :)).


Время: 16:28.

Время: 16:28.
© OSzone.net 2001-