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

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

Ответить
Настройки темы
[решено] Непроходимые контролы!...

Аватара для semiono

Ветеран


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

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


Имеем простое окно 4 табами SysTabControl32, причём все Istance:1 0_O

Задача в том, чтобы нажать хотябы 2-й таб, чтоб переключиться на его таб-"окно"

При старте первым открывается это:
Код: Выделить весь код
103 DIALOG 1, 13, 230, 54
STYLE WS_CHILD
CAPTION ""
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
FONT 9, "Arial"
{
   CONTROL "", 1001, EDIT, ES_CENTER | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 7, 15, 216, 12 
   CONTROL "setup", 2001, BUTTON, BS_PUSHBUTTON | BS_FLAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 182, 35, 40, 12 
   CONTROL "", 1002, EDIT, ES_CENTER | ES_AUTOHSCROLL | WS_CHILD | WS_BORDER | WS_TABSTOP, 7, 35, 167, 12 
}
окно второй закладки это:
Код: Выделить весь код
102 DIALOG 1, 13, 230, 54
STYLE WS_CHILD
CAPTION ""
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
FONT 9, "Arial"
{
   CONTROL "", 1001, EDIT, ES_CENTER | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 7, 15, 216, 12 
   CONTROL "setup", 2001, BUTTON, BS_PUSHBUTTON | BS_FLAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 182, 35, 40, 12 
}
а это я даже не знаю что
Код: Выделить весь код
101 DIALOGEX 0, 0, 235, 70
STYLE DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION ""
CLASS  "XXXZZZCLASS32"
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
FONT 9, "Arial"
{
   CONTROL "Tab1", 1001, "SysTabControl32", TCS_TABS | WS_CHILD | WS_VISIBLE, 0, 0, 235, 70 , 0x00020000
}
больше ресурсов не видно, только три этих... хотя реально 4 закладки, из которых 3-я это просто логотип-картинка-about, а 4-й это Exit - без окна сразу по нажатию.
?

-------
Полезное сообщение


Отправлено: 13:23, 06-02-2009

 

Аватара для semiono

Ветеран


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

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


Проще, покажу даже как есть

Код: Выделить весь код
Run("zzzz.exe", @ScriptDir)
WinWait("[Class:NINormalWindow00400000]") ;Ожидаем *появление* (существование) окна
WinActivate("[Class:NINormalWindow00400000]") ;Активируем окно (выводим на фронт)
WinWaitActive("[Class:NINormalWindow00400000]") ;Это нужно для ожидания *активного* окна

_ControlClickEx("[Class:NINormalWindow00400000]", "", "Main", 363, 168)

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("Main", $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
??? не правильно?

-------
Полезное сообщение


Последний раз редактировалось Creat0R, 08-02-2009 в 22:44. Причина: Добавлен тег code для кода


Отправлено: 16:41, 08-02-2009 | #11



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

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


Аватара для Creat0R

Must AutoIt


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

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


Цитата semiono:
Я о том, что если я записал вашу функцию _ControlClickEx + с + её +определением ниже, то она работает с моим окном? »
А проверить?

Цитата semiono:
все ли переменные в вашем листинге универсальны, чтоб прямо скопировать в мой код? »
Там всё локальное, не нужны никакие переменные.

Цитата semiono:
не правильно? »
Оно не работает?

P.S
!!! Я последнее предупреждение даю, куски кода заключайте в тег code, неприятно раскапывать текст среди этой каши. Как использовать тег см. тут.

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

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

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

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

Отправлено: 22:43, 08-02-2009 | #12


Аватара для semiono

Ветеран


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

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


Всё дело было в задержке! Даже исходный текст не всегда срабатывает, я не сразу заметил это.
Всё заработало когда я Sleep(100) добавил перед функцией!
Моё внешнее окно тоже работает отлично!

offtop:
Меня ещё очередной раз до этого выручило тупое повторение комманды в одном другом приложении
Код: Выделить весь код
WinActivate("Product Authorization Wizard")
WinActivate("Product Authorization Wizard")
WinActivate("Product Authorization Wizard")
WinActivate("Product Authorization Wizard")
WinActivate("Product Authorization Wizard")
WinActivate("Product Authorization Wizard")
WinActivate("Product Authorization Wizard")
Sleep(100)
WinWaitActive("Product Authorization Wizard")
Sleep(100)
ControlSetText("Product Authorization Wizard","","Edit1",$sSelect1)
Дело в том что это плагин, который открываться только в окне из какой нибудь хост-программы.
И в одном случае он сразу получал нужное окно, а в случае вызова из другой программы, сразу
не получалось и я уже чисто эксперементально решил зделать повторы и сработало!

Это я к тому что задержки и повторы, это реально проблемма! Я теперь часто sleep везде ставлю.

-------
Полезное сообщение


Отправлено: 05:52, 09-02-2009 | #13


Аватара для Creat0R

Must AutoIt


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

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


Цитата semiono:
решил зделать повторы и сработало »
Тут скорее (для надёжности) нужно активировать пока не появится видимое окно (как я сам недавно выяснил, даже скрытое окно может быть активным)...

Код: Выделить весь код
_WinKeepActivate("Product Authorization Wizard", "", 10) ;Ждём 10 секунд появление активного и видимого окна

ControlSetText("Product Authorization Wizard", "", "Edit1", $sSelect1)

Func _WinKeepActivate($sTitle, $sText, $iTime=0)
    Local $iTimer = -1
    If $iTime > 0 Then $iTimer = TimerInit()

    While Not BitAND(WinGetState($sTitle, $sText), 8) Or Not BitAND(WinGetState($sTitle, $sText), 2)
        WinActivate($sTitle, $sText)

        Sleep(10)
        If $iTime > 0 And (TimerDiff($iTimer) / 1000) >= $iTime Then ExitLoop
    WEnd

    Return Number(BitAND(WinGetState($sTitle, $sText), 2) = 2)
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

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

Отправлено: 14:40, 09-02-2009 | #14


Аватара для semiono

Ветеран


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

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


HELP!! то работает то нет, не могу понять... там диалог между двумя окнами, я правда в одном из них ресурсы подредактировал, но не может быть что из-за этого, так как окно "видится" как и было, однако код стал криво работать, не пойму что такое... хотя причину я конечто же вижу, дело в том что мне было подсказанно такое -
Код: Выделить весь код
$Var1 = ClipGet()
ControlSetText("abcd","","Edit2", $Var1)
но как я могу привинтить переменную, когда у меня клик по кнопке "PASTE FROM CLIPBOARD" (Class:button)
Я уже чуть-повыше кодом эксперементировал с клип буффером, но там тоже глюки, то получается то нет...
Я даже это вставлял - _ClipBoard_Empty() кое где...
Однако без буффера обмена видимо никак! Помогите, код уже почти готов! Последний шаг не срабатывает...

Код: Выделить весь код
#include <GuiTab.au3>
; это мой хитрый ход, для того чтоб [Class:NINormalWindow00400000] всегда запускался на регистрацию...
RegDelete("HKLM\Software\Native Instruments\AkoustikPiano","KEY") 
RegDelete("HKLM\Software\Native Instruments\AkoustikPiano","SNO")
RegDelete("HKLM\Software\Native Instruments\AkoustikPiano","SYSTEMID")

; тут восстанавливаем "SNO" и таким образом обходим первое окно из [Class:NINor... , чтоб проще было
Run(@ScriptDir & "\Xetup.exe")
Sleep(100)
WinActivate(": ~")
Sleep(100)
WinWaitActive(": ~","","SysTabControl321")
Sleep(100)
ControlFocus(": ~","","Edit1")
Sleep(100)
$xxx = ControlGetText(": ~","","Edit1")
Sleep(100)
RegWrite("HKLM\Software\Native Instruments\AkoustikPiano","SNO","REG_SZ", $xxx)
Sleep(100)

; Тут нам [Class:NINorm... даёт SYSTEMID
Run(@ScriptDir & "\Zetup.exe")
Sleep(100)
WinActivate("[Class:NINormalWindow00400000]")
Sleep(100)
WinWaitActive("[Class:NINormalWindow00400000]")
Sleep(100)
_ControlClickEx("[Class:NINormalWindow00400000]", "", "Main", 363, 168)
Sleep(100)

; тут кое какие ещё действия...
WinActivate(": ~")
Sleep(100)
WinWaitActive(": ~")
Sleep(100)
$hTab = ControlGetHandle(": ~","","SysTabControl321")
Sleep(100)
_GUICtrlTab_ClickTab($hTab, 1)
Sleep(100)
ControlFocus(": ~","","Edit2")
Sleep(100)
ControlClick(": ~","","Edit2", "left", 2)
Sleep(100)
ControlClick(": ~","","Edit2", "right", 1)
Sleep(100)
Send("{DOWN 4}")
Sleep(100)
Send("{ENTER}")
Sleep(100)

; закрываем всякие Success - ненужные окна...
ControlClick(": ~","","Button2", "left", 1)
Sleep(100)
WinWaitActive("...")
Sleep(100)
WinClose("...")
Sleep(100)
WinClose(": ~")

; НО тут у нас ловится опять SYSTEMID, а надо было с этого места ""_GUICtrlTab_ClickTab($hTab, 1)""
; Как тут из буфера выловить результ предыдущего job???? 
; было бы хорошо еслиб конечно такое работало - $var = Send("{ENTER}") :)
WinActivate("[Class:NINormalWindow00400000]")
Sleep(100)
WinWaitActive("[Class:NINormalWindow00400000]")
Sleep(100)
_ControlClickEx("[Class:NINormalWindow00400000]", "", "Main", 100, 412)
Sleep(100)
_ControlClickEx("[Class:NINormalWindow00400000]", "", "Main", 100,540) ; это уже EXIT
Sleep(100)
WinWaitActive("[CLASS:#32770]")
Sleep(100)

WinClose("[CLASS:#32770]")
Sleep(100)

WinClose("[Class:NINormalWindow00400000]")
Exit

; За это массу благодарностей, всё на пять работает :-)
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("Main", $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
ЗЫ !!! Я кажись точно поломал своё окно! это там причина... щас разберусь... оно в буфер ничего не даёт...
Зато по автоиту сколько узнал нового код возможно этот даже правильный...

-------
Полезное сообщение


Последний раз редактировалось semiono, 10-02-2009 в 02:58.


Отправлено: 01:54, 10-02-2009 | #15


Аватара для Creat0R

Must AutoIt


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

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


Цитата semiono:
Я даже это вставлял - _ClipBoard_Empty() кое где »
Для очистки буфера можно просто поместить в него пустое значение: ClipPut("").

Цитата semiono:
Как тут из буфера выловить результ предыдущего job »
$Var = ClipGet().

Цитата semiono:
было бы хорошо еслиб конечно такое работало - $var = Send("{ENTER}") »
Зачем? Можно просто подождать немного после нажатия на кнопку, и получить содержимое б.обмена.

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

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

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

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

Отправлено: 02:25, 10-02-2009 | #16


Аватара для semiono

Ветеран


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

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


Да, точно! Вот прикол, я из ресурса удалил строку
CONTROL "", 1002, EDIT, ES_CENTER | ES_AUTOHSCROLL | WS_CHILD | WS_BORDER | WS_TABSTOP, 7, 45, 167, 12
так как её в реальном окне вообще не видно, там всего только один Edit встречается на каждом табе, ну я решил,
что это просто забыли поошибке и снёс. Как оказалось видимо это поле используется для копирования...
хм. востановил, теперь работает и код в автоит тоже верный!
хотя какие-то сбои иногда встречались, или же это проблеммы из-за "некорректной" программы были...
однако оптимизировать бы ещё? иногда tab3-й открывался вместо 2-го... Всё ли в моём листинге верно
на беглый взгляд там? Я ещё потестирую, посмотрю. хотя я ламер

-------
Полезное сообщение


Отправлено: 03:22, 10-02-2009 | #17


Аватара для semiono

Ветеран


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

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


мдя.. как-то надо уменьшить скорость чтоль в функции
Код: Выделить весь код
Func _ControlClickEx($sTitle, $sText="", $sButton="Main", $iCtrl_X_Coord=0, $iCtrl_Y_Coord=0)
...
Перескакивает часто на 3-й таб, хотя и не всегда! через раз где-то
Мне кажется увеличить время перед вызовом непосредственно тут -
Код: Выделить весь код
Sleep(100) ; ?
_GUICtrlTab_ClickTab($hTab, 1)
вряд ли поможет?... Скорее бы как-то точность попадания улучшить? Или ещё что либо?
------------------------
Добавил время перемещения, стало лучше немного...
Код: Выделить весь код
...    
MouseClick("Main", $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], 3)
Только мне что-то не нравиться что курсор всегда возвращается на прежнее место,
нельзя ли его оставлять над нажатой кнопкой, что естественнее?... ато прыгает как на пружине, когда задержку я зделал это очевидно стало
Но видимо сейчас вся трабла именно в табах, то-есть в окне WinActivate(": ~"), блин я бы снёс эти два ненужных таба
но их не видно средь ресурсов... только мешаются!

Вот второй таб который только и нужен, может его явно можно нажать? Точнее это ресурс который видно при нажатии.
Код: Выделить весь код
103 DIALOG 1, 13, 180, 38
STYLE WS_CHILD
CAPTION ""
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
FONT 9, "Arial"
{
   CONTROL "", 1001, EDIT, ES_CENTER | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 3, 5, 174, 12 
   CONTROL "Generate", 2001, BUTTON, BS_PUSHBUTTON | BS_FLAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 3, 22, 174, 12 
   CONTROL "", 1002, EDIT, ES_CENTER | ES_AUTOHSCROLL | WS_CHILD | WS_BORDER | WS_TABSTOP, 3, 48, 174, 12 
}
а это что-то у них общее наверно
Код: Выделить весь код
101 DIALOGEX 0, 0, 185, 54
STYLE DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION ""
CLASS  "SYSTEMCLASS32"
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
FONT 9, "Arial"
{
   CONTROL "Tab1", 1001, "SysTabControl32", TCS_TABS | WS_CHILD | WS_VISIBLE, 0, 0, 185, 54 , 0x00020000
}

-------
Полезное сообщение


Последний раз редактировалось semiono, 10-02-2009 в 18:02.


Отправлено: 17:32, 10-02-2009 | #18


Аватара для Creat0R

Must AutoIt


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

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


Цитата semiono:
как-то точность попадания улучшить? »
_GUICtrlTab_ClickTab ориентируется на позиции индекса, это не самый точный результат, лучше использовать _GUICtrlTab_SetCurSel($hTab, 1).

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

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

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

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

Отправлено: 17:48, 10-02-2009 | #19


Аватара для semiono

Ветеран


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

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


Стало лучше! но один раз промахнулся...
А маус нельзя оставлять в нажатой позиции до следущего действия? Ато он скачет к кнопке и назад в старт позицию,
возможно это даже привоидит к лишней нагрузке на работу скрипта.

PS вот только прикол заметил! разница в применении _GUICtrlTab_SetCurSel($hTab, 1) в том, что при нажатии 2-таба,
остаётся прорисованным первое окно, если это только не моё видео виснет, но не думаю... наверное таковы свойства окна,
хотя работает корректно! Только сбой чё-то всёж есть иногда...

//
впрочем я догадался ; MouseMove($aOld_Mouse_Pos[0], $aOld_Mouse_Pos[1], 3) закоментировать!
///
"решено" - так как при клике используется позиция, при этом ещё окно из одной прог имееет внутреннее свойство OnTop, то получается что оно иногда перекрывает кнопку заднего окна - в этом было половина моих глюков...
добавил WinMove(": ~",0,22,"","",3)
Только почему-то окно всегда вообще исчезает, даже если указать его реальные размеры. Наверное тут ещё притягивание на десктопе вмешивается. И у меня ещё таск бар сверху, который многие окна игнорируют и считают
от нуля! Но полюбому окно что-то пропадает, но зато работает нормально!
Причём если зделать искажённые размеры в WinMove - то вообще получается тёмная полоска на экране - чудеса!
Этим тоже можно пользоваться вместо например @HIDE - крута! Остались только редкие непопадания в нужный таб... :\
И жаль ещё, что WinWait сначало показывает, а только позже WinMove срабатывает, хотелось бы уж сразу!

ЗЫ имхо дело в повторах, сразу стало стабильнее!
Код: Выделить весь код
Run(@ScriptDir & "\Xetup.exe")
WinActivate(": ~")
WinActivate(": ~")
WinActivate(": ~")
WinWaitActive(": ~","","SysTabControl321")
...
_GUICtrlTab_SetCurSel($hTab, 1)
_GUICtrlTab_SetCurSel($hTab, 1)
_GUICtrlTab_SetCurSel($hTab, 1)
_GUICtrlTab_SetCurSel($hTab, 1)
_GUICtrlTab_SetCurSel($hTab, 1)
...
Я пришёл к выводу, что даже вместо Sleep() лучше повторять комманду, так как она ещё вдобавок полезно нагружает
процессор, и мне даже кажется, что сами приложения работают таким образом только используюя loop наверно,
если это конечно в автоит не приводит к искажению кода, то в самый раз юзать репиты!

-------
Полезное сообщение


Последний раз редактировалось semiono, 11-02-2009 в 20:50.


Отправлено: 18:08, 10-02-2009 | #20



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - Контролы, чекбоксы, прокрутка, кнопки пропали, или стали плоскими mnugamba Microsoft Windows 2000/XP 1 11-11-2009 15:56
Под Win2000 не работают контролы IZOprogman Microsoft Windows NT/2000/2003 3 19-01-2007 02:42




 
Переход