Показать полную графическую версию : [решено] Как кликнуть по кнопке ToolStripButton
alexey_a
13-03-2009, 18:20
есть приложение, у которого есть есть несколько кнопок класса ToolStripButton. Приложение написано на С#. Как можно кликать по этим кнопкам?
ToolStripButton »
а кнопки не на tool bar-е? а то можно попытаться:
#Include <GuiToolBar.au3>
Local $hToolbar = ControlGetHandle('[CLASS:SciTEWindow]', '', '[CLASS:ToolbarWindow32; INSTANCE:1]')
_GUICtrlToolbar_ClickIndex($hToolbar, 16)
и ClassnameNN у них одинаковый?
Как можно кликать по этим кнопкам? »
Примерно так:
ControlClick("Title", "", "[CLASS:ToolStripButton]")
alexey_a
16-03-2009, 14:49
Кнопка находится на панели 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 и потом уже с помощью методов этого объекта нажимать на кнопки. Проблема в том, что я не знаю как это сделать и можно ли вообще это сделать.
Ни один из предложенных вариантов не работает.
вот так можно получить хендл панели на которой распологаются кнопки...
$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
вот так можно получить хендл панели на которой распологаются кнопки...
$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
если прям на них, думаю тогда и непосредственный хэндл кнопки можно вытащить... »
Этот текст находится не на кнопках. Просто на основном окне находится 5 панелей типа ToolStrip. а н акнопках находятся картинки.
проще говоря есть 5 штук toolStrip панелей на которых есть кнопочки.
т.е. toolStrip панели - очень похожи на toolBar, так?
тогда стоит искать решение через win api.
alexey_a
18-03-2009, 11:06
тогда стоит искать решение через win api. »
А можно чуть подробнее, как примено с помощью Win API функций можно это сделать?
это только возможно ))
но если нет возможности получить 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, вернуть курсор на место
и снова отобразить его..
хм...
Win API »
до этого думал, что _GUICtrlToolbar_ClickButton
как то поумномы вытаскивает Handle кнопки на панели,
потому и предложил......а окозалось все так тривиально )))))
alexey_a
18-03-2009, 18:30
т.е. может попробовать получить X и Y положение панели и потом незаметно сдвинуть курсор
на нужно колличество пиксилей по X и Y, выслать MouseClick, вернуть курсор на место
и снова отобразить его.. »
работать с координатами мне не подходит, так разрешение экрана может быть разным да и нет гарантии что девелоперы не поменяют расположение кнопки. Плюс есть одно "но", хоть в МСДН ничег оне сказано про то, что с помощью sendmessage можно управлять контролом ToolStripButton.
Так дело в том, что бы у панели - на которой кнопки всегда был один и тот же класс.
Тогда по классу - можно будет найти положение этой панели и уже отталкиваясь от положения
панели вычислить положение кнопки. Разрешение экрана тут не влияет.
нет гарантии что девелоперы не поменяют расположение кнопки »
так и нет гарнатии, что эти кнопки в следующей версии вообще будут - верно?
или высть необходимость мега универсальной утилиты на века? :)
Посмотрите код выше - там все доходчиво.......помойму )))
alexey_a
18-03-2009, 18:58
такое решение я бы назвал workaround и оно уже реализовано. но хочется чтобы я точно знал, что нажимаю конкретную кнопку, а не просто тыкаю мышкой по координатам. Спасибо за предложенный вариант!!!
alexey_a
02-04-2009, 16:57
Нашел решение: попросил девелоперов разместить каждый ToolStripButton на отдельной ToolStrip панели.
Нашел решение: попросил девелоперов разместить каждый ToolStripButton на отдельной ToolStrip панели.
Мега Решение!! .....вот бы microsoft попросить ...хм.... ;)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.