PDA

Показать полную графическую версию : [решено] Эмуляция ввода с клавиатуры или клик мышки на кнопку в неактивном окне


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

amel27
27-02-2009, 05:07
Эмуляция ввода с клавиатуры или клик мышки на кнопку в неактивном окне »
гм.. не понял - "кликаньем мышкой" или нажатием клавиш можно воздействовать на "неактивное окно"?.. если нет - то, собственно, и "эмулировать" нечего... если да - то для начала нужно зафиксировать порядок нажатий, однозначно приводящий к нужному результату

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

Иск
27-02-2009, 13:32
гм.. не понял - "кликаньем мышкой" или нажатием клавиш можно воздействовать на "неактивное окно"?.. »

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

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

Creat0R
27-02-2009, 19:56
Так и не понял что такое этот 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

Ещё см. эту тему (http://forum.oszone.net/thread-131162.html).

amel27
28-02-2009, 05:42
если окно нельзя идентифицировать, остается только посылать мышку в нужные координаты и кликать, делая тем самым неактивное окно активным? »идентифицировать не "окно", а "контрол" - окно можно идентифицировать почти всегда, а при эмуляции кликов неактивное окно полюбому станет активным

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

Creat0R
28-02-2009, 12:30
amel27, это если контрол неактивного окна видим на экране
Как я понял, в случае Иск'а он видим.

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




© OSzone.net 2001-2012