|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Непроходимые контролы!... |
|
[решено] Непроходимые контролы!...
|
Ветеран Сообщения: 842 |
Имеем простое окно 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 } ? |
|
------- Отправлено: 13:23, 06-02-2009 |
Ветеран Сообщения: 842
|
Профиль | Отправить 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 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата semiono:
Цитата semiono:
Цитата semiono:
P.S !!! Я последнее предупреждение даю, куски кода заключайте в тег code, неприятно раскапывать текст среди этой каши. Как использовать тег см. тут. |
|||
------- Отправлено: 22:43, 08-02-2009 | #12 |
Ветеран Сообщения: 842
|
Профиль | Отправить 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 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить 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 |
|
------- Отправлено: 14:40, 09-02-2009 | #14 |
Ветеран Сообщения: 842
|
Профиль | Отправить PM | Цитировать HELP!! то работает то нет, не могу понять... там диалог между двумя окнами, я правда в одном из них ресурсы подредактировал, но не может быть что из-за этого, так как окно "видится" как и было, однако код стал криво работать, не пойму что такое... хотя причину я конечто же вижу, дело в том что мне было подсказанно такое -
но как я могу привинтить переменную, когда у меня клик по кнопке "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 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата semiono:
Цитата semiono:
Цитата semiono:
|
|||
------- Отправлено: 02:25, 10-02-2009 | #16 |
Ветеран Сообщения: 842
|
Профиль | Отправить 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 |
Ветеран Сообщения: 842
|
Профиль | Отправить PM | Цитировать мдя.. как-то надо уменьшить скорость чтоль в функции
Func _ControlClickEx($sTitle, $sText="", $sButton="Main", $iCtrl_X_Coord=0, $iCtrl_Y_Coord=0) ... ![]() Мне кажется увеличить время перед вызовом непосредственно тут - вряд ли поможет?... Скорее бы как-то точность попадания улучшить? Или ещё что либо? ------------------------ Добавил время перемещения, стало лучше немного... ... 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 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата semiono:
|
|
------- Отправлено: 17:48, 10-02-2009 | #19 |
Ветеран Сообщения: 842
|
Профиль | Отправить 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) ... процессор, и мне даже кажется, что сами приложения работают таким образом только используюя loop наверно, если это конечно в автоит не приводит к искажению кода, то в самый раз юзать репиты! ![]() |
------- Последний раз редактировалось semiono, 11-02-2009 в 20:50. Отправлено: 18:08, 10-02-2009 | #20 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Интерфейс - Контролы, чекбоксы, прокрутка, кнопки пропали, или стали плоскими | mnugamba | Microsoft Windows 2000/XP | 1 | 11-11-2009 15:56 | |
Под Win2000 не работают контролы | IZOprogman | Microsoft Windows NT/2000/2003 | 3 | 19-01-2007 02:42 |
|