[решено] Непроходимые контролы!...

Аватара пользователя
semiono

[решено] Непроходимые контролы!...

Сообщение semiono »

Имеем простое окно 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 - без окна сразу по нажатию.

?
Аватара пользователя
semiono

Re: [решено] Непроходимые контролы!...

Сообщение semiono »

Цитата semiono:



причём все Istance:1
[решено] Непроходимые контролы!...




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




Цитата semiono:



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




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



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





Код:

Код: Выделить всё

#include 
#include 
$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

Re: [решено] Непроходимые контролы!...

Сообщение semiono »

24th December, 2008 - v3.3.0.0

Added: _GUICtrlTab_ClickTab

кочаю новую версию, за ними не угнаться! Изображение




Цитата Creat0R:



Более чем одного таба в окне содержаться не может
[решено] Непроходимые контролы!...




табы то разные, но дело в том, что у них как будто название одинаковое...

либо просто не видно, как это у taskmgr было? У всех INSTANCE:1 показывает.

вообще это окно хакеры делали, от них не знаешь чего ожидать Изображение

ща проверим...
Аватара пользователя
Creat0R

Re: [решено] Непроходимые контролы!...

Сообщение Creat0R »

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



Код:

Код: Выделить всё

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

Хендлы - прямо ассемблер какой-то Изображение
Аватара пользователя
semiono

Re: [решено] Непроходимые контролы!...

Сообщение semiono »

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



Код:

Код: Выделить всё

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

Хендлы - прямо ассемблер какой-то Изображение
Аватара пользователя
semiono

Re: [решено] Непроходимые контролы!...

Сообщение semiono »

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







Посмотрите, может вам напоминает это какойнибудь типичный "класс" окон? В ресурсах этого тулса,

вообще диалогов не видно, и соответственно AutoIt Info тоже не видит ничего кроме заголовка окна...

Как же в нём кнопки "нащупать", нажать Copy? Я пока через хендл подбираюсь, но не знаюю...

Нечто такое _GUICtrlButton_Click только там в хелпе переменных много, фиг разберёшся. Изображение
Аватара пользователя
Creat0R

Re: [решено] Непроходимые контролы!...

Сообщение Creat0R »

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





Код:

Код: Выделить всё

#include 
$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

Re: [решено] Непроходимые контролы!...

Сообщение semiono »

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



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



Код:

Код: Выделить всё

_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[/i]"? Главная функюция в Си ? Изображение

Вот моё окно $handle = WinGetHandle("[Class:NINormalWindow00400000]","")

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



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

Нужен ли WinWaitActive() ?



????
Аватара пользователя
semiono

Re: [решено] Непроходимые контролы!...

Сообщение semiono »

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



как это узнать когда не знаешь изначально?
[решено] Непроходимые контролы!...




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

Re: [решено] Непроходимые контролы!...

Сообщение Creat0R »

Цитата Creat0R:



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




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


Цитата Creat0R:



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




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


Цитата Creat0R:



Скорее так:
[решено] Непроходимые контролы!...




Да! я тоже думал, что обязательно надо зафокусировать окно! Иначе было бы не очень надёжно, и как я увидел,

весь наборчег команд - это как бы неизменно должно быть от скрипта к скрипту! ОК! Законспектировано! Изображение

-------------

#6 - получается что я просто не могу попасть в кнопки, так как код функции я определил, и ожидание окна и собсно запуск выполнил?

получается дело только в особенности этого окошка?


Цитата Creat0R:



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




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

или чего-то ещё недоопределенно? все ли переменные в вашем листинге универсальны, чтоб прямо скопировать в мой код? (я приводил примеры выше #6 )
Ответить

Вернуться в «AutoIt»