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

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

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

Аватара для semiono

Ветеран


Сообщения: 842
Благодарности: 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

 

Аватара для Creat0R

Must AutoIt


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

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


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

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

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

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:34, 06-02-2009 | #2



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

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


Аватара для semiono

Ветеран


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

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


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

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

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


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


Отправлено: 00:48, 07-02-2009 | #3


Аватара для semiono

Ветеран


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

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


YeS! Достаточно получить хендл и применить функцию, которой впрочем не было раньше
Код: Выделить весь код
#include <GuiConstants.au3>
#include <GuiTab.au3>
; Работает!!!
Run(@ScriptDir & "\exec.exe")
WinWaitActive("MyWin")
$hTab = ControlGetHandle("MyWin","","SysTabControl321")
_GUICtrlTab_ClickTab($hTab, 1)
Хендлы - прямо ассемблер какой-то

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

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

Отправлено: 03:58, 07-02-2009 | #4


Аватара для semiono

Ветеран


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

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


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



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

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


Отправлено: 05:06, 07-02-2009 | #5


Аватара для Creat0R

Must AutoIt


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

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


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

Код: Выделить весь код
#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»).

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

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

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

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

Отправлено: 10:06, 07-02-2009 | #6


Аватара для semiono

Ветеран


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

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


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

Я решил что из вашего примера мне надо взять только этот кусок? -
Код: Выделить весь код
_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, 08-02-2009 в 16:38.


Отправлено: 16:30, 07-02-2009 | #7


Аватара для semiono

Ветеран


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

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


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

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

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

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


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


Аватара для Creat0R

Must AutoIt


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

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


Цитата 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:
как это узнать когда не знаешь изначально? »
Парадоксальный вопрос, не так ли? Ответ тут простой, никак! Если распознать невозможно, значит так было задуманно, элемент создан нестандартными средствами, и вшыт в его оболочку (например нарисован, и обрабатывается на уровне "образа", а не действующего элемента).

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

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

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

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

Отправлено: 23:40, 07-02-2009 | #9


Аватара для semiono

Ветеран


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

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


Цитата Creat0R:
Парадоксальный вопрос, не так ли »
Я просто имел ввиду, что тут какраз хендлы помогают "как по волшебству", ибо не понимал их суть, так как у нас уже были сложные окна...
Цитата Creat0R:
Чтобы идентифицировать элементы, например при многочисленном использовании, и/или при динамической смене заголовка окна. »
То-есть всегда можно указать явно, как альтернатива, не используя переменных, хотя понятно что менее оправдано?
Цитата Creat0R:
Скорее так: »
Да! я тоже думал, что обязательно надо зафокусировать окно! Иначе было бы не очень надёжно, и как я увидел,
весь наборчег команд - это как бы неизменно должно быть от скрипта к скрипту! ОК! Законспектировано!
-------------
#6 - получается что я просто не могу попасть в кнопки, так как код функции я определил, и ожидание окна и собсно запуск выполнил?
получается дело только в особенности этого окошка?
Цитата Creat0R:
Ну вообще то это запустит Setup.exe и не вернёт ничего пока процесс не будет полностью выполнен, другими словами, функция будет ждать закрытие процесса. »
!!! Я о том, что если я записал вашу функцию _ControlClickEx + с + её +определением ниже, то она работает с моим окном?
или чего-то ещё недоопределенно? все ли переменные в вашем листинге универсальны, чтоб прямо скопировать в мой код? (я приводил примеры выше #6 )

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


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


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



Компьютерный форум 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




 
Переход