Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Эмуляция ввода с клавиатуры или клик мышки на кнопку в неактивном окне

Ответить
Настройки темы
[решено] Эмуляция ввода с клавиатуры или клик мышки на кнопку в неактивном окне

Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 03:44, 27-02-2009

 

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 05:07, 27-02-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 13:32, 27-02-2009 | #3


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата Иск:
Так и не понял что такое этот 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
Ещё см. эту тему.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Последний раз редактировалось Creat0R, 28-02-2009 в 12:29.

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:56, 27-02-2009 | #4


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 05:42, 28-02-2009 | #5


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


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

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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:30, 28-02-2009 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Эмуляция ввода с клавиатуры или клик мышки на кнопку в неактивном окне

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Как на AutoIt заблокировать кнопку CTRL или ALT...или отключить диспетчер задач? Fraks AutoIt 12 02-02-2010 11:51
Как сделать двойной клик на объекте, без мышки? Twix1124 AutoIt 2 26-07-2009 21:48
[решено] как перехватить клик мышки? proxy AutoIt 7 21-03-2009 11:13
Загрузка - эмуляция p\s2 клавиатуры neoris Microsoft Windows 2000/XP 0 04-03-2008 18:40
[решено] Язык ввода по умолчанию в окне логона sPave Microsoft Windows NT/2000/2003 5 30-03-2007 13:43




 
Переход