Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Непроходимые контролы!... (http://forum.oszone.net/showthread.php?t=131162)

semiono 06-02-2009 13:23 1031234

Непроходимые контролы!...
 
Имеем простое окно 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 - без окна сразу по нажатию.
?

Creat0R 06-02-2009 14:34 1031292

Цитата:

Цитата semiono
причём все Istance:1 »

Более чем одного таба в окне содержаться не может (в стандартной функции создающей окно таба), все вкладки слздаются в этом одном элементе (SysTabControl).

Цитата:

Цитата semiono
больше ресурсов не видно »

Да вообще то это не самый первый метод которым бы я воспользовался, это как говорится, «для продвинутых» ;)

Нажать на таб (а точнее активировать вкладку таба) можно так:

Код:

#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


semiono 07-02-2009 00:48 1031785

24th December, 2008 - v3.3.0.0
Added: _GUICtrlTab_ClickTab
кочаю новую версию, за ними не угнаться! :)

Цитата:

Цитата Creat0R
Более чем одного таба в окне содержаться не может »

табы то разные, но дело в том, что у них как будто название одинаковое...
либо просто не видно, как это у taskmgr было? У всех INSTANCE:1 показывает.
вообще это окно хакеры делали, от них не знаешь чего ожидать :)
ща проверим...

semiono 07-02-2009 03:58 1031827

YeS! Достаточно получить хендл и применить функцию, которой впрочем не было раньше :)
Код:

#include <GuiConstants.au3>
#include <GuiTab.au3>
; Работает!!!
Run(@ScriptDir & "\exec.exe")
WinWaitActive("MyWin")
$hTab = ControlGetHandle("MyWin","","SysTabControl321")
_GUICtrlTab_ClickTab($hTab, 1)

Хендлы - прямо ассемблер какой-то =)

semiono 07-02-2009 05:06 1031836

Я думал, что самое трудное прошёл, не тут то было, ещё хуже окно встретилось!



Посмотрите, может вам напоминает это какойнибудь типичный "класс" окон? В ресурсах этого тулса,
вообще диалогов не видно, и соответственно AutoIt Info тоже не видит ничего кроме заголовка окна...
Как же в нём кнопки "нащупать", нажать Copy? Я пока через хендл подбираюсь, но не знаюю...
Нечто такое _GUICtrlButton_Click только там в хелпе переменных много, фиг разберёшся. :)

Creat0R 07-02-2009 10:06 1031899

Если все известные методы не справились с задачей, то единственное что осталось, так это кликать в этом окне заранее известные координаты (относительно текущего окна), вот так:

Код:

#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»).

semiono 07-02-2009 16:30 1032116

Ничего не получается :(

Я решил что из вашего примера мне надо взять только этот кусок? -
Код:

_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() ?

????

semiono 07-02-2009 17:10 1032142

Что за таг у этой темы? [решено] - ничего ещё не решено...
В теме taskmgr наоборот, всё уже ясно однако без тэга тема, почему?
мне просто здесь оч важно довести до кондиции этот код...

Скажите, а вот так имеет ли смысл?
RunWait("zzzz.exe", @ScriptDir)
WinWaitActive("AkoustikPiano") ; {- это тоже не знаю, надо ли или можно пропустить...}
$hWin = WinGetHandle("AkoustikPiano")
$hCtrl = ControlGetHandle($hWin, "", "button1")
ControlClick("AkoustikPiano", "", $hCtrl) ; Что мне даёт это с хендлом? Или ничего?

То-есть я хочу понять зачем нужны хендлы? Или они нужны лишь для подстановки в некоторых функциях,
как бы в некоторых особых случаях?
Сдругой стороны, тут более важно узнать реальный тип контрола
button1 или button2 или это вообще не button - как это узнать когда не знаешь изначально?

Creat0R 07-02-2009 23:40 1032442

Цитата:

Цитата semiono
Что значит "Main"? »

Это для клика мышкой, значит главная кнопка, т.е обычно это левая кнопка, но поскольку кнопки мышки могут быть изменены (например для левшы), лучше использовать главную (Main).

Цитата:

Цитата semiono
Нужен ли его $handle или фунция сама всё найдёт? »

Сама найдёт.

Цитата:

Цитата semiono
Кроме запуска RunWait("setup.exe", @ScriptDir) Что ещё надо в моём коде ? »

Ну вообще то это запустит Setup.exe и не вернёт ничего пока процесс не будет полностью выполнен, другими словами, функция будет ждать закрытие процесса. Опять напоминаю, читаем справку.

Цитата:

Цитата semiono
ничего ещё не решено »

Вопрос в первом сообщении решён, всё остальное частичный(?) офтопик.

Цитата:

Цитата semiono
вот так имеет ли смысл? »

Скорее так:

Код:

Run("zzzz.exe", @ScriptDir)
WinWait("AkoustikPiano") ;Ожидаем *появление* (существование) окна
WinActivate("AkoustikPiano") ;Активируем окно (выводим на фронт)
WinWaitActive("AkoustikPiano") ;Это нужно для ожидания *активного* окна
$hWin = WinGetHandle("AkoustikPiano") ;Получаем идентификатор окна, это и есть хендл
$hCtrl = ControlGetHandle($hWin, "", "button1") ;Получаем идентификатор контрола (элемента GUI)
ControlClick($hWin, "", $hCtrl) ;Кликаем в нашем окне по контролю, разницы в принципе нет, что с хендлами, что с прямыми строками имен элементов

[Используйте тег кода, я кажется уже напоминал вам об этом].


Цитата:

Цитата semiono
зачем нужны хендлы? »

Чтобы идентифицировать элементы, например при многочисленном использовании, и/или при динамической смене заголовка окна.

Цитата:

Цитата semiono
как это узнать когда не знаешь изначально? »

Парадоксальный вопрос, не так ли? :) Ответ тут простой, никак! Если распознать невозможно, значит так было задуманно, элемент создан нестандартными средствами, и вшыт в его оболочку (например нарисован, и обрабатывается на уровне "образа", а не действующего элемента).

semiono 08-02-2009 16:14 1032832

Цитата:

Цитата Creat0R
Парадоксальный вопрос, не так ли »

Я просто имел ввиду, что тут какраз хендлы помогают "как по волшебству", ибо не понимал их суть, так как у нас уже были сложные окна... :)
Цитата:

Цитата Creat0R
Чтобы идентифицировать элементы, например при многочисленном использовании, и/или при динамической смене заголовка окна. »

То-есть всегда можно указать явно, как альтернатива, не используя переменных, хотя понятно что менее оправдано?
Цитата:

Цитата Creat0R
Скорее так: »

Да! я тоже думал, что обязательно надо зафокусировать окно! Иначе было бы не очень надёжно, и как я увидел,
весь наборчег команд - это как бы неизменно должно быть от скрипта к скрипту! ОК! Законспектировано! :)
-------------
#6 - получается что я просто не могу попасть в кнопки, так как код функции я определил, и ожидание окна и собсно запуск выполнил?
получается дело только в особенности этого окошка?
Цитата:

Цитата Creat0R
Ну вообще то это запустит Setup.exe и не вернёт ничего пока процесс не будет полностью выполнен, другими словами, функция будет ждать закрытие процесса. »

!!! Я о том, что если я записал вашу функцию _ControlClickEx + с + её +определением ниже, то она работает с моим окном?
или чего-то ещё недоопределенно? все ли переменные в вашем листинге универсальны, чтоб прямо скопировать в мой код? (я приводил примеры выше #6 )

semiono 08-02-2009 16:41 1032848

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

Код:

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:43 1033140

Цитата:

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

А проверить?

Цитата:

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

Там всё локальное, не нужны никакие переменные.

Цитата:

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

Оно не работает?

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

semiono 09-02-2009 05:52 1033275

Всё дело было в задержке! Даже исходный текст не всегда срабатывает, я не сразу заметил это.
Всё заработало когда я 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 везде ставлю.

Creat0R 09-02-2009 14:40 1033568

Цитата:

Цитата 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


semiono 10-02-2009 01:54 1034131

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

ЗЫ !!! Я кажись точно поломал своё окно! :) это там причина... щас разберусь... оно в буфер ничего не даёт...
Зато по автоиту сколько узнал нового :) код возможно этот даже правильный...

Creat0R 10-02-2009 02:25 1034142

Цитата:

Цитата semiono
Я даже это вставлял - _ClipBoard_Empty() кое где »

Для очистки буфера можно просто поместить в него пустое значение: ClipPut("").

Цитата:

Цитата semiono
Как тут из буфера выловить результ предыдущего job »

$Var = ClipGet().

Цитата:

Цитата semiono
было бы хорошо еслиб конечно такое работало - $var = Send("{ENTER}") »

Зачем? Можно просто подождать немного после нажатия на кнопку, и получить содержимое б.обмена.

semiono 10-02-2009 03:22 1034156

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

semiono 10-02-2009 17:32 1034688

мдя.. как-то надо уменьшить скорость чтоль в функции
Код:

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
}


Creat0R 10-02-2009 17:48 1034704

Цитата:

Цитата semiono
как-то точность попадания улучшить? »

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

semiono 10-02-2009 18:08 1034711

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

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 наверно,
если это конечно в автоит не приводит к искажению кода, то в самый раз юзать репиты! :)


Время: 19:11.

Время: 19:11.
© OSzone.net 2001-