Показать полную графическую версию : [решено] Эмуляция ввода с клавиатуры или клик мышки на кнопку в неактивном окне
В общем следующая проблема, решил вернуться к некогда заброшенному проекту, столкнулся со следующей проблемой. Имеем 2 абсолютно одинаковых окна (Title, Class одинаковые, различаются только положением и Handle ( что это такое?никак не разберусь...) одно активное, второе соответственно нет . Можно ли как-нибудь из активного посылать в неактивное нажатие клавиши, к примеру "{DELETE}" или зная координаты кнопки ( кнопка не как Class, а просто кусок окна, в Atoit Window Info никак не определяется) нажать на нее не активируя окно ? Если можно , примеры дайте, пожалуйста. Нашел инфу что через ControlSend можно как-то, но не знаю как заставить посылать именно в неактивное, не знаю как заставить различать активное от неактивного.... Заранее спасибо!
Эмуляция ввода с клавиатуры или клик мышки на кнопку в неактивном окне »
гм.. не понял - "кликаньем мышкой" или нажатием клавиш можно воздействовать на "неактивное окно"?.. если нет - то, собственно, и "эмулировать" нечего... если да - то для начала нужно зафиксировать порядок нажатий, однозначно приводящий к нужному результату
через ControlSend можно как-то, но не знаю как заставить посылать именно в неактивное »AFAIK если контрол нельзя идентифицировать, то ControlSend не поможет - только эмуляция
гм.. не понял - "кликаньем мышкой" или нажатием клавиш можно воздействовать на "неактивное окно"?.. »
Кликать-то можно, только окно станет активным и это занимает некоторое время на прогрузку. Кликнул на окно, оно активировалось, подождал чуток, кликнул мышкой на нужную область или послал команду через Send.
То есть, если окно нельзя идентифицировать, остается только посылать мышку в нужные координаты и кликать, делая тем самым неактивное окно активным? Больше никаких вариантов нет? Так и не понял что такое этот Handle (В Atoit Window Info 2 окна различаются только в этом параметре, который при каждом запуске меняется, но у двух окон всегда разный ) Может можно сделать идентификацию по этому параметру? К примеру гружу окно №1 ,считываю и записываю его Handle ( уж не знаю как, правда), потом гружу окно № 2, делаю тоже самое. Получится у меня 2 уникальных окна. Если я буду знать куда точно посылать текст, можно ли будет посылать в неактивное окно? В общем все это теория и наверно глупо со стороны смотрится :(
Так и не понял что такое этот 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).
если окно нельзя идентифицировать, остается только посылать мышку в нужные координаты и кликать, делая тем самым неактивное окно активным? »идентифицировать не "окно", а "контрол" - окно можно идентифицировать почти всегда, а при эмуляции кликов неактивное окно полюбому станет активным
проверять нужно через WinList + WinActive по хендлу, вот так примерно»
ну это если контрол неактивного окна видим на экране, к тому же по опыту - некоторые приложения первый клик используют только для активации окна, для нажатия на контрол приходится кликать дважды на одном месте
amel27, это если контрол неактивного окна видим на экране
Как я понял, в случае Иск'а он видим.
некоторые приложения первый клик используют только для активации окна, для нажатия на контрол приходится кликать дважды на одном месте
Да, было такое. Значит перед нажатием активируем окно (кликать два раза не лучший вариант, так как может действительно два раза по кнопке нажать). Подправил немного свой пример выше (также исправил там использование параметра $sButton :)).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.