Показать полную графическую версию : [решено] Непроходимые контролы!...
Имеем простое окно 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 - без окна сразу по нажатию.
?
причём все Istance:1 »
Более чем одного таба в окне содержаться не может (в стандартной функции создающей окно таба), все вкладки слздаются в этом одном элементе (SysTabControl).
больше ресурсов не видно »
Да вообще то это не самый первый метод которым бы я воспользовался, это как говорится, «для продвинутых» ;)
Нажать на таб (а точнее активировать вкладку таба) можно так:
#include <GuiConstants.au3>
#include <GuiTab.au3>
$GUI = GUICreate("Test Script", 300, 200)
$Tab = GUICtrlCreateTab(20, 40, 260, 120)
GUICtrlCreateTabItem("Tab1")
GUICtrlCreateTabItem("Tab2")
GUICtrlCreateTabItem("Tab3")
GUISetState(@SW_SHOW, $GUI)
Sleep(500)
$hTab = ControlGetHandle("Test Script", "", "SysTabControl321")
_GUICtrlTab_ClickTab($hTab, 1)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
24th December, 2008 - v3.3.0.0
Added: _GUICtrlTab_ClickTab
кочаю новую версию, за ними не угнаться! :)
Более чем одного таба в окне содержаться не может »
табы то разные, но дело в том, что у них как будто название одинаковое...
либо просто не видно, как это у taskmgr было? У всех INSTANCE:1 показывает.
вообще это окно хакеры делали, от них не знаешь чего ожидать :)
ща проверим...
YeS! Достаточно получить хендл и применить функцию, которой впрочем не было раньше :)
#include <GuiConstants.au3>
#include <GuiTab.au3>
; Работает!!!
Run(@ScriptDir & "\exec.exe")
WinWaitActive("MyWin")
$hTab = ControlGetHandle("MyWin","","SysTabControl321")
_GUICtrlTab_ClickTab($hTab, 1)
Хендлы - прямо ассемблер какой-то =)
Я думал, что самое трудное прошёл, не тут то было, ещё хуже окно встретилось!
http://img291.imageshack.us/img291/9185/snap1wl6.th.png (http://img291.imageshack.us/img291/9185/snap1wl6.png) http://img25.imageshack.us/img25/3748/snap2me6.th.png (http://img25.imageshack.us/img25/3748/snap2me6.png)
Посмотрите, может вам напоминает это какойнибудь типичный "класс" окон? В ресурсах этого тулса,
вообще диалогов не видно, и соответственно AutoIt Info тоже не видит ничего кроме заголовка окна...
Как же в нём кнопки "нащупать", нажать Copy? Я пока через хендл подбираюсь, но не знаюю...
Нечто такое _GUICtrlButton_Click только там в хелпе переменных много, фиг разберёшся. :)
Если все известные методы не справились с задачей, то единственное что осталось, так это кликать в этом окне заранее известные координаты (относительно текущего окна), вот так:
#include <GuiConstants.au3>
$GUI = GUICreate("AkoustikPiano", 300, 200)
$Button = GUICtrlCreateButton("Copy", 20, 40, 60, 20)
GUISetState(@SW_SHOW, $GUI)
_ControlClickEx("AkoustikPiano", "", "Main", 50, 50)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $Button
MsgBox(64, "", "Button is clicked.", 0, $GUI)
EndSwitch
WEnd
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
Координаты получать с помощью AutoIt Info Tool, задав параметр Client в меню «Options - Coord Mode» (когда наводим курсор на кнопку, смотреть вкладку «Mouse -> Position»).
Ничего не получается :(
Я решил что из вашего примера мне надо взять только этот кусок? -
_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
Но может какие-то хэнедлы надо определить? Что значит "Main"? Главная функюция в Си ? :)
Вот моё окно $handle = WinGetHandle("[Class:NINormalWindow00400000]","")
Нужен ли его $handle или фунция сама всё найдёт?
Кроме запуска RunWait("setup.exe", @ScriptDir) Что ещё надо в моём коде ?
Нужен ли WinWaitActive() ?
????
Что за таг у этой темы? [решено] - ничего ещё не решено...
В теме taskmgr наоборот, всё уже ясно однако без тэга тема, почему?
мне просто здесь оч важно довести до кондиции этот код...
Скажите, а вот так имеет ли смысл?
RunWait("zzzz.exe", @ScriptDir)
WinWaitActive("AkoustikPiano") ; {- это тоже не знаю, надо ли или можно пропустить...}
$hWin = WinGetHandle("AkoustikPiano")
$hCtrl = ControlGetHandle($hWin, "", "button1")
ControlClick("AkoustikPiano", "", $hCtrl) ; Что мне даёт это с хендлом? Или ничего?
То-есть я хочу понять зачем нужны хендлы? Или они нужны лишь для подстановки в некоторых функциях,
как бы в некоторых особых случаях?
Сдругой стороны, тут более важно узнать реальный тип контрола
button1 или button2 или это вообще не button - как это узнать когда не знаешь изначально?
Что значит "Main"? »
Это для клика мышкой, значит главная кнопка, т.е обычно это левая кнопка, но поскольку кнопки мышки могут быть изменены (например для левшы), лучше использовать главную (Main).
Нужен ли его $handle или фунция сама всё найдёт? »
Сама найдёт.
Кроме запуска RunWait("setup.exe", @ScriptDir) Что ещё надо в моём коде ? »
Ну вообще то это запустит Setup.exe и не вернёт ничего пока процесс не будет полностью выполнен, другими словами, функция будет ждать закрытие процесса. Опять напоминаю, читаем справку.
ничего ещё не решено »
Вопрос в первом сообщении решён, всё остальное частичный(?) офтопик.
вот так имеет ли смысл? »
Скорее так:
Run("zzzz.exe", @ScriptDir)
WinWait("AkoustikPiano") ;Ожидаем *появление* (существование) окна
WinActivate("AkoustikPiano") ;Активируем окно (выводим на фронт)
WinWaitActive("AkoustikPiano") ;Это нужно для ожидания *активного* окна
$hWin = WinGetHandle("AkoustikPiano") ;Получаем идентификатор окна, это и есть хендл
$hCtrl = ControlGetHandle($hWin, "", "button1") ;Получаем идентификатор контрола (элемента GUI)
ControlClick($hWin, "", $hCtrl) ;Кликаем в нашем окне по контролю, разницы в принципе нет, что с хендлами, что с прямыми строками имен элементов
[Используйте тег кода, я кажется уже напоминал вам об этом].
зачем нужны хендлы? »
Чтобы идентифицировать элементы, например при многочисленном использовании, и/или при динамической смене заголовка окна.
как это узнать когда не знаешь изначально? »
Парадоксальный вопрос, не так ли? :) Ответ тут простой, никак! Если распознать невозможно, значит так было задуманно, элемент создан нестандартными средствами, и вшыт в его оболочку (например нарисован, и обрабатывается на уровне "образа", а не действующего элемента).
Парадоксальный вопрос, не так ли »
Я просто имел ввиду, что тут какраз хендлы помогают "как по волшебству", ибо не понимал их суть, так как у нас уже были сложные окна... :)
Чтобы идентифицировать элементы, например при многочисленном использовании, и/или при динамической смене заголовка окна. »
То-есть всегда можно указать явно, как альтернатива, не используя переменных, хотя понятно что менее оправдано?
Скорее так: »
Да! я тоже думал, что обязательно надо зафокусировать окно! Иначе было бы не очень надёжно, и как я увидел,
весь наборчег команд - это как бы неизменно должно быть от скрипта к скрипту! ОК! Законспектировано! :)
-------------
#6 - получается что я просто не могу попасть в кнопки, так как код функции я определил, и ожидание окна и собсно запуск выполнил?
получается дело только в особенности этого окошка?
Ну вообще то это запустит Setup.exe и не вернёт ничего пока процесс не будет полностью выполнен, другими словами, функция будет ждать закрытие процесса. »
!!! Я о том, что если я записал вашу функцию _ControlClickEx + с + её +определением ниже, то она работает с моим окном?
или чего-то ещё недоопределенно? все ли переменные в вашем листинге универсальны, чтоб прямо скопировать в мой код? (я приводил примеры выше #6 )
Проще, покажу даже как есть
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
??? не правильно?
Я о том, что если я записал вашу функцию _ControlClickEx + с + её +определением ниже, то она работает с моим окном? »
А проверить?
все ли переменные в вашем листинге универсальны, чтоб прямо скопировать в мой код? »
Там всё локальное, не нужны никакие переменные.
не правильно? »
Оно не работает?
P.S
!!! Я последнее предупреждение даю, куски кода заключайте в тег code, неприятно раскапывать текст среди этой каши. Как использовать тег см. тут (http://forum.oszone.net/misc.php?do=bbcode#code).
Всё дело было в задержке! Даже исходный текст не всегда срабатывает, я не сразу заметил это.
Всё заработало когда я 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 везде ставлю.
решил зделать повторы и сработало »
Тут скорее (для надёжности) нужно активировать пока не появится видимое окно (как я сам недавно выяснил, даже скрытое окно может быть активным)...
_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
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
ЗЫ !!! Я кажись точно поломал своё окно! :) это там причина... щас разберусь... оно в буфер ничего не даёт...
Зато по автоиту сколько узнал нового :) код возможно этот даже правильный...
Я даже это вставлял - _ClipBoard_Empty() кое где »
Для очистки буфера можно просто поместить в него пустое значение: ClipPut("").
Как тут из буфера выловить результ предыдущего job »
$Var = ClipGet().
было бы хорошо еслиб конечно такое работало - $var = Send("{ENTER}") »
Зачем? Можно просто подождать немного после нажатия на кнопку, и получить содержимое б.обмена.
Да, точно! Вот прикол, я из ресурса удалил строку
CONTROL "", 1002, EDIT, ES_CENTER | ES_AUTOHSCROLL | WS_CHILD | WS_BORDER | WS_TABSTOP, 7, 45, 167, 12
так как её в реальном окне вообще не видно, там всего только один Edit встречается на каждом табе, ну я решил,
что это просто забыли поошибке и снёс. Как оказалось видимо это поле используется для копирования...
хм. востановил, теперь работает и код в автоит тоже верный!
хотя какие-то сбои иногда встречались, или же это проблеммы из-за "некорректной" программы были...
однако оптимизировать бы ещё? иногда tab3-й открывался вместо 2-го... Всё ли в моём листинге верно
на беглый взгляд там? Я ещё потестирую, посмотрю. хотя я ламер :)
мдя.. как-то надо уменьшить скорость чтоль в функции
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
}
как-то точность попадания улучшить? »
_GUICtrlTab_ClickTab ориентируется на позиции индекса, это не самый точный результат, лучше использовать _GUICtrlTab_SetCurSel($hTab, 1).
Стало лучше! но один раз промахнулся...
А маус нельзя оставлять в нажатой позиции до следущего действия? Ато он скачет к кнопке и назад в старт позицию,
возможно это даже привоидит к лишней нагрузке на работу скрипта.
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 наверно,
если это конечно в автоит не приводит к искажению кода, то в самый раз юзать репиты! :)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.