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

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

alexey_a 13-03-2009 18:20 1062916

Как кликнуть по кнопке ToolStripButton
 
есть приложение, у которого есть есть несколько кнопок класса ToolStripButton. Приложение написано на С#. Как можно кликать по этим кнопкам?

proxy 13-03-2009 20:53 1063044

Цитата:

Цитата alexey_a
ToolStripButton »

а кнопки не на tool bar-е? а то можно попытаться:

Код:

#Include <GuiToolBar.au3>

Local $hToolbar = ControlGetHandle('[CLASS:SciTEWindow]', '', '[CLASS:ToolbarWindow32; INSTANCE:1]')
_GUICtrlToolbar_ClickIndex($hToolbar, 16)

и ClassnameNN у них одинаковый?

Creat0R 13-03-2009 22:58 1063156

Цитата:

Цитата alexey_a
Как можно кликать по этим кнопкам? »

Примерно так:
Код:

ControlClick("Title", "", "[CLASS:ToolStripButton]")

alexey_a 16-03-2009 14:49 1065455

Кнопка находится на панели ToolStrip. AutoIt window Info тул выдает следующую инфу для этой панели:

>>>> Window <<<<
Title: Intel® GPA System Analyzer
Class: WindowsForms10.Window.8.app.0.218f99c
Position: 176, 232
Size: 1100, 905
Style: 0x16CF0000
ExStyle: 0x00050100
Handle: 0x01C8073E

>>>> Control <<<<
Class: WindowsForms10.Window.8.app.0.218f99c
Instance: 29
ClassnameNN: WindowsForms10.Window.8.app.0.218f99c29
Advanced (Class): [CLASS:WindowsForms10.Window.8.app.0.218f99c; INSTANCE:29]
ID: 461078
Text: toolStrip1
Position: 232, 4
Size: 856, 27
ControlClick Coords: 675, 10
Style: 0x56000000
ExStyle: 0x00010000
Handle: 0x00070916

>>>> Mouse <<<<
Position: 1087, 276
Cursor ID: 0
Color: 0xECE9D8

>>>> StatusBar <<<<

>>>> Visible Text <<<<
082
:
32
:
00
:
00
Current
FPS
Target FPS
30
16
State
Overrides
Disable all overrides
toolStrip1
toolStrip2
toolStrip3
toolStrip4
toolStrip5
Find:
toolStrip1
Zoom - low
System Overview
ToolStrip
ToolStrip
ToolStrip
ToolStrip
ToolStrip
chartDundas1


>>>> Hidden Text <<<<

Этот же тул не распознает отдельно кнопки типа ToolStripButton. Проблема в том, что AutoIt напрямую не может работать с панелей класса ToolStrip. Проблема может быть решена следующим образом (как мне кажется): приаттачится в процессу, получить ссылку на объект класса ToolStrip и потом уже с помощью методов этого объекта нажимать на кнопки. Проблема в том, что я не знаю как это сделать и можно ли вообще это сделать.
Ни один из предложенных вариантов не работает.

proxy 16-03-2009 18:38 1065670

вот так можно получить хендл панели на которой распологаются кнопки...
$hHwd = ControlGetHandle('[CLASS:WindowsForms10.Window.8.app.0.218f99c]', '', '[CLASS:WindowsForms10.Window.8.app.0.218f99c; INSTANCE:29]')
так пробовал, с примером выше? уже есть хэндл на эту панель, далее искать метод как тыкнуть на нужную кнопку...
а этот текст прям на кнопках:
toolStrip1
toolStrip2
toolStrip3
toolStrip4
toolStrip5
...
ToolStrip
ToolStrip
ToolStrip
ToolStrip
ToolStrip
если прям на них, думаю тогда и непосредственный хэндл кнопки можно вытащить...

alexey_a 17-03-2009 11:27 1066200

Цитата:

Цитата proxy
вот так можно получить хендл панели на которой распологаются кнопки...
$hHwd = ControlGetHandle('[CLASS:WindowsForms10.Window.8.app.0.218f99c]', '', '[CLASS:WindowsForms10.Window.8.app.0.218f99c; INSTANCE:29]')
так пробовал, с примером выше? уже есть хэндл на эту панель, далее искать метод как тыкнуть на нужную кнопку... »

Пробовал - не получается.

Цитата:

Цитата proxy
а этот текст прям на кнопках:
toolStrip1
toolStrip2
toolStrip3
toolStrip4
toolStrip5
...
ToolStrip
ToolStrip
ToolStrip
ToolStrip
ToolStrip
если прям на них, думаю тогда и непосредственный хэндл кнопки можно вытащить... »

Этот текст находится не на кнопках. Просто на основном окне находится 5 панелей типа ToolStrip. а н акнопках находятся картинки.

proxy 17-03-2009 15:24 1066384

проще говоря есть 5 штук toolStrip панелей на которых есть кнопочки.
т.е. toolStrip панели - очень похожи на toolBar, так?
тогда стоит искать решение через win api.

alexey_a 18-03-2009 11:06 1067054

Цитата:

Цитата proxy
тогда стоит искать решение через win api. »

А можно чуть подробнее, как примено с помощью Win API функций можно это сделать?

proxy 18-03-2009 11:35 1067085

это только возможно ))
но если нет возможности получить Hadle кнопки, а только целой панели...
тут есть такая хитрость - к примеру как это делает _GUICtrlToolbar_ClickButton:

Код:

Func _GUICtrlToolbar_ClickButton($hWnd, $iCommandID, $sButton = "left", $fMove = False, $iClicks = 1, $iSpeed = 1)
    If $Debug_TB Then _GUICtrlToolbar_ValidateClassName($hWnd)
    Local $tPoint, $tRect, $iX, $iY, $iMode, $aPos

    $tRect
= _GUICtrlToolbar_GetButtonRectEx($hWnd, $iCommandID)
    $tPoint = _WinAPI_PointFromRect($tRect)
    $tPoint = _WinAPI_ClientToScreen($hWnd, $tPoint)
    _WinAPI_GetXYFromPoint($tPoint, $iX, $iY)
    $iMode = Opt("MouseCoordMode", 1)
    If Not $fMove Then
        $aPos = MouseGetPos()
        _WinAPI_ShowCursor(False)
        MouseClick($sButton, $iX, $iY, $iClicks, $iSpeed)
        MouseMove($aPos[0], $aPos[1], 0)
        _WinAPI_ShowCursor(True)
    Else
        MouseClick($sButton, $iX, $iY, $iClicks, $iSpeed)
    EndIf
    Opt("MouseCoordMode", $iMode)
EndFunc  ;==>_GUICtrlToolbar_ClickButton

т.е. может попробовать получить X и Y положение панели и потом незаметно сдвинуть курсор
на нужно колличество пиксилей по X и Y, выслать MouseClick, вернуть курсор на место
и снова отобразить его..

хм...

Цитата:

Цитата alexey_a
Win API »

до этого думал, что _GUICtrlToolbar_ClickButton
как то поумномы вытаскивает Handle кнопки на панели,
потому и предложил......а окозалось все так тривиально )))))

alexey_a 18-03-2009 18:30 1067484

Цитата:

Цитата proxy
т.е. может попробовать получить X и Y положение панели и потом незаметно сдвинуть курсор
на нужно колличество пиксилей по X и Y, выслать MouseClick, вернуть курсор на место
и снова отобразить его.. »

работать с координатами мне не подходит, так разрешение экрана может быть разным да и нет гарантии что девелоперы не поменяют расположение кнопки. Плюс есть одно "но", хоть в МСДН ничег оне сказано про то, что с помощью sendmessage можно управлять контролом ToolStripButton.

proxy 18-03-2009 18:49 1067511

Так дело в том, что бы у панели - на которой кнопки всегда был один и тот же класс.
Тогда по классу - можно будет найти положение этой панели и уже отталкиваясь от положения
панели вычислить положение кнопки. Разрешение экрана тут не влияет.
Цитата:

Цитата alexey_a
нет гарантии что девелоперы не поменяют расположение кнопки »

так и нет гарнатии, что эти кнопки в следующей версии вообще будут - верно?
или высть необходимость мега универсальной утилиты на века? :)
Посмотрите код выше - там все доходчиво.......помойму )))

alexey_a 18-03-2009 18:58 1067520

такое решение я бы назвал workaround и оно уже реализовано. но хочется чтобы я точно знал, что нажимаю конкретную кнопку, а не просто тыкаю мышкой по координатам. Спасибо за предложенный вариант!!!

alexey_a 02-04-2009 16:57 1082079

Нашел решение: попросил девелоперов разместить каждый ToolStripButton на отдельной ToolStrip панели.

proxy 02-04-2009 17:56 1082150

Цитата:

Нашел решение: попросил девелоперов разместить каждый ToolStripButton на отдельной ToolStrip панели.
Мега Решение!! .....вот бы microsoft попросить ...хм.... ;)


Время: 13:35.

Время: 13:35.
© OSzone.net 2001-