Что нового

Не нажимается кнопка на toolbar

MiOksa

Новичок
Сообщения
12
Репутация
0
Есть программа для системы контроля доступом fortnet. Требуется:
1) Автологин при входе
2) Нажатие на кнопку автоплан.

Первую задачу решил:
Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=Icon_1.ico
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
Global 	$fortnet
		$fortnet ="[TITLE:frmSplash; CLASS:TfrmSplash]"	;имя титульного окна
Global 	$fortnet_get
		$fortnet_get =WinGetHandle('[TITLE:frmSplash; CLASS:TfrmSplash]')	;поиск имени титульного окна
Global $path = IniRead ( 'C:\fortnet_autologin.ini', "DATA", "PATH", "NotFound" ) ;путь к программе
Global $login = IniRead ( 'C:\fortnet_autologin.ini', "DATA", "LOGIN", "NotFound" )	;логин
Global $pass = IniRead ( 'C:\fortnet_autologin.ini', "DATA", "PASSWORD", "NotFound" )	;пароль

 While 1=1
		If Not ProcessExists("fortnet.exe") Then
				Run ( $path)
		EndIf
		WinActive($fortnet, "")
		If 	ControlGetHandle($fortnet,"","[CLASS:TComboBox; INSTANCE:1]") Then ;проверка на появление элемента ввода пользователя
			ControlCommand ($fortnet, "", "[CLASS:TComboBox; INSTANCE:1]", "SelectString", $login)	;выбор пользователя
			ControlSend($fortnet, "", "[CLASS:TEdit; INSTANCE:1]", $pass)	;ввод пароля
			ControlSend($fortnet, "", "[CLASS:TEdit; INSTANCE:1]",'{ENTER}')	;вход
		EndIf
		Sleep(5000) ; ожидание загрузки фортнет 5 сек
WEnd


А вот со второй проблема, дело в том, что кнопка автоплана находится в панели toolbar в виде рисунка. Она 1 из 4 кнопок.

Вот что выдает autoit windows info:
Код:
>>>> Window <<<<
Title:	FortNet
Class:	TfrmMainArm
Position:	-8, -8
Size:	1382, 784
Style:	0x17CF0000
ExStyle:	0x00010100
Handle:	0x004B0A7C

>>>> Control <<<<
Class:	TTBXToolbar
Instance:	1
ClassnameNN:	TTBXToolbar1
Name:	
Advanced (Class):	[CLASS:TTBXToolbar; INSTANCE:1]
ID:	2033910
Text:	tbButtons
Position:	339, 0
Size:	102, 26
ControlClick Coords:	18, 13
Style:	0x56000000
ExStyle:	0x00010000
Handle:	0x001F08F6

>>>> Mouse <<<<
Position:	357, 13
Cursor ID:	0
Color:	0x000000

Пытался:

Код:
Global  $fortnet_o
    $fortnet_o ="[TITLE:FortNet; CLASS:TfrmMainArm]"    ;имя операторского окна
Global  $fortnet_get_o
    $fortnet_get_o=WinGetHandle('[TITLE:FortNet; CLASS:TfrmMainArm]')   ;поиск имени операторского окна

    WinActive($fortnet_o, "")
    ControlClick ($fortnet_get_o,"","[CLASS:TTBXToolbar; INSTANCE:1]", "left",1, 18, 13)  ;нажатие кнопки автоплан

Но кнопка мыши нажимается в том месте где находится курсор

Пытался и так:
Код:
#Include <WinAPIEx.au3>
#include <GuiToolbar.au3>
#include <ToolbarConstants.au3>

Global  $fortnet_o
    $fortnet_o ="[TITLE:FortNet; CLASS:TfrmMainArm]"    ;имя операторского окна
Global  $fortnet_get_o
    $fortnet_get_o=WinGetHandle('[TITLE:FortNet; CLASS:TfrmMainArm]')   ;поиск имени операторского окна

WinWaitActive($fortnet_o)
$hWnd = WinGetHandle($fortnet_o)
$iProcID = WinGetProcess($fortnet_o)
$hToolBar = ControlGetHandle($hWnd, "", "[CLASS:TTBXToolbar; INSTANCE:1]")
$iCommand = _GUICtrlToolbar_IndexToCommand($hToolBar, 0)
_SendMessage($hToolBar, $WM_COMMAND, $iCommand, $hToolBar)


Но реакции ни какой не заметил, может что-то не так делаю

Операционная система Windows 7.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
MiOksa,
А Вы уверены, что нужная Вам кнопка на Toolbar имеет индекс 0?
Попробуйте по тексту, если он, конечно есть, найти нужную кнопку.
Код:
#include <GuiToolbar.au3>
;...
$hWnd = WinGetHandle($fortnet_o)
;$iProcID = WinGetProcess($fortnet_o)
$hToolBar = ControlGetHandle($hWnd, "", "[CLASS:TTBXToolbar; INSTANCE:1]")
$iCount = _GUICtrlToolbar_ButtonCount($hToolBar)
ConsoleWrite($iCount & @CR)
For $i = 0 To $iCount - 1
	$iCommand = _GUICtrlToolbar_IndexToCommand($hToolBar, $i)
	$sText = _GUICtrlToolbar_GetButtonText($hToolBar, $iCommand)
	MsgBox(64, 'Index: ' & $i, $sText)
Next
;...
 
Автор
M

MiOksa

Новичок
Сообщения
12
Репутация
0
Поиск по тексту ни каких результатов не показал, текст вставлял в
Код:
ControlGetHandle($hWnd, "текст", "[CLASS:TTBXToolbar; INSTANCE:1]")

Вопрос, а какой текст вставлять, если там рисунки, лишь когда наводишь появляются подсказки?
 
Автор
M

MiOksa

Новичок
Сообщения
12
Репутация
0
Вроде внимательно изучил, текст брал из выпадающей подсказки, ни какого сообщения не получил. По поводу индекса не уверен, что 0.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
MiOksa,
Покажите скриншот Вашего TTBXToolbar и укажите на какую кнопку надо нажать.
 
Автор
M

MiOksa

Новичок
Сообщения
12
Репутация
0
Вот скриншот с нажатой кнопкой
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
MiOksa,
Это весь TTBXToolbar или слева еще что-то есть?
 
Автор
M

MiOksa

Новичок
Сообщения
12
Репутация
0
Общий вид программы

Вот я его вытянул, о смотриться как отдельный элемент.

Слева еще 2 toolbar-а

Самое интересное как его у него сразу поменялся class и title

Код:
>>>> Window <<<<
Title:	tbButtons
Class:	TTBXFloatingWindowParent
Position:	1051, 126
Size:	116, 59
Style:	0x94840000
ExStyle:	0x00000180
Handle:	0x00380AD2

>>>> Control <<<<
Class:	TTBXToolbar
Instance:	1
ClassnameNN:	TTBXToolbar1
Name:	
Advanced (Class):	[CLASS:TTBXToolbar; INSTANCE:1]
ID:	788754
Text:	tbButtons
Position:	0, 0
Size:	100, 25
ControlClick Coords:	16, 10
Style:	0x56000000
ExStyle:	0x00010000
Handle:	0x000C0912

>>>> Mouse <<<<
Position:	16, 10
Cursor ID:	2
Color:	0xFFFF00

>>>> StatusBar <<<<

>>>> ToolsBar <<<<

>>>> Visible Text <<<<
tbButtons
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
MiOksa,
1. Здесь сколько кнопок показывает?
Код:
;...
$iCount = _GUICtrlToolbar_ButtonCount($hToolBar)
;...

2. Можно попробовать нажимать по очереди на все кнопки подряд:
Код:
#include <GuiToolbar.au3>
#include <WindowsConstants.au3>

$fExitLoop = False
HotKeySet('1', '_ExitLoop')

$hWnd = WinWait('[TITLE:FortNet;CLASS:TfrmMainArm]', '', 5)
If Not $hWnd Then
	MsgBox(16, 'Error', 'Нет окна')
	Exit
EndIf
$hToolBar = ControlGetHandle($hWnd, "", "[CLASS:TTBXToolbar;INSTANCE:1]")
$iCount = _GUICtrlToolbar_ButtonCount($hToolBar)
ConsoleWrite($iCount & @CR)

For $i = 0 To $iCount - 1
	$iCommand = _GUICtrlToolbar_IndexToCommand($hToolBar, $i)
	_SendMessage($hToolBar, $WM_COMMAND, $iCommand, $hToolBar)
	MsgBox(64, 'Info', 'Index: ' & $i)
	If $fExitLoop Then ExitLoop
Next

Func _ExitLoop()
	$fExitLoop = True
EndFunc   ;==>_ExitLoop
Если нажмет на нужную кнопку, нажмите на клавиатуре "1", чтобы не нажимать дальше, Полученный индекс (из MsgBox) вставите вместо 0 в
Код:
;...
$iCommand = _GUICtrlToolbar_IndexToCommand($hToolBar, 0)
;...


PS
Class и Title нужный поставьте.
 
Автор
M

MiOksa

Новичок
Сообщения
12
Репутация
0
1. Ни чего не показывает
2. Вроде как окно программы увидел, но кнопки так и не переключала программа, т.е ничего не происходило.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
MiOksa,
Попробуйте так найти Toolbar.
Код:
#include <GuiToolbar.au3>
#include <Array.au3>
#include <WinAPIEx.au3> ;Yashied, http://autoit-script.ru/index.php/topic,47.0.html

$hWnd = WinWait('[TITLE:FortNet;CLASS:TfrmMainArm]', '', 5)
If Not $hWnd Then
	MsgBox(16, 'Error', 'Нет окна')
	Exit
EndIf
$aData = _WinAPI_EnumChildWindows($hWnd, 0)
If @error Then
	MsgBox(16, 'Error', 'Error')
	Exit
EndIf
Dim $aResult[$aData[0][0] + 1][4] = [[$aData[0][0]]]
For $i = 1 To $aResult[0][0]
	$aResult[$i][0] = $aData[$i][0];Handle
	$aResult[$i][1] = $aData[$i][1];ClassName
	$aResult[$i][2] = _WinAPI_GetDlgCtrlID($aData[$i][0]);ID
	If StringInStr($aData[$i][1], 'Toolbar') Then
		$aResult[$i][3] = _GUICtrlToolbar_ButtonCount($aResult[$i][0]);кол-во кнопок Toolbar
	EndIf
Next
_ArrayDisplay($aResult)
 
Автор
M

MiOksa

Новичок
Сообщения
12
Репутация
0
Нашел 4 toolbar:

Row |Col0 |Col1 |Col2 |Col3
[2] |0x002F079A|TTBXToolbar|3082138|0
[3] |0x0025063A|TTBXToolbar|2426426|0
[4] |0x002701A2|TTBXToolbar|2556322|0
[16] |0x00270740|TToolBar |2557760|13


Я так понял:
Col0= Handle
Col1=ClassName
Col2=ID
Col3=Количество кнопок, но почему стоит 0 не пойму.

Предпалагаю, что требуемый toolbar скорее всего row=2-4, а дальше, что это дает пока понять не могу.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
MiOksa,
Я не знаю, почему не показывает на Вашем окне кол-во кнопок Toolbar (т.е. и остальные функции для Toolbar работать не будут). Например, на µTorrent 3.0 без проблем находит их 3 штуки и выдает информацию по ним.

А если попробовать поискать не на '[TITLE:FortNet;CLASS:TfrmMainArm]', а на '[TITLE:tbButtons;CLASS:TTBXFloatingWindowParent]'
 
Автор
M

MiOksa

Новичок
Сообщения
12
Репутация
0
Находит 1 toolbar:
Row |Col0 |Col1 |Col2 |Col3
[2] |0x002F079A|TTBXToolbar|3082138|0

Но опять же показывает 0 кнопок. есть ли вариант как-то по цвету нажимать на кнопку, или так не получиться?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
MiOksa,
Мне не понятно что это за TToolBar: [16] |0x00270740|TToolBar |2557760|13
 
Автор
M

MiOksa

Новичок
Сообщения
12
Репутация
0
Пробывал скриптик по нажиманию всех кнопок, который вы выложили ранее, только вставил туда
Код:
$hToolBar = ControlGetHandle($hWnd, "", "[CLASS:TToolbar;INSTANCE:1]")
.
Результата ноль, тоже ничего не нажималось.

Думал, а можно сделать, чтобы нажималось на сам план вручную. Красным выделил на скриншоте что нажать.

Опять же controlclick не проходит

Код:
>>>> Window <<<<
Title:	FortNet
Class:	TfrmMainArm
Position:	-8, -8
Size:	1382, 784
Style:	0x17CF0000
ExStyle:	0x00010100
Handle:	0x00480BDE

>>>> Control <<<<
Class:	TPageControl
Instance:	1
ClassnameNN:	TPageControl1
Name:	
Advanced (Class):	[CLASS:TPageControl; INSTANCE:1]
ID:	4327182
Text:	
Position:	212, 27
Size:	1155, 574
ControlClick Coords:	113, 12
Style:	0x56010040
ExStyle:	0x00000000
Handle:	0x0042070E

>>>> Mouse <<<<
Position:	325, 39
Cursor ID:	0
Color:	0xF0F0F0

>>>> StatusBar <<<<

>>>> ToolsBar <<<<

>>>> Visible Text <<<<
tbButtons
tbArms
TBXmnMenu
Охрана - Связь с модулем опроса [skdsrv] отсутствует
Сотрудники
Сотрудники
Где угодно
 Поиск
Сообщения
Окно фотографий КПП4
Окно фотографий КПП4
Свойства


>>>> Hidden Text <<<<
Хозяева помещений
Аппаратура
ToolBar1
Дерево аппаратуры



Добавлено:
Сообщение автоматически объединено:

Решил проблему другим путем, через TPageControl:
Код:
ControlFocus('[TITLE:FortNet;CLASS:TfrmMainArm]', "", "[CLASS:TPageControl; INSTANCE:1]")
               Send("{RIGHT}")


Но все равно интересно, почему не работает через toolbar
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
MiOksa
Не уверен, что код поможет, но как говорится "попытка не пытка". :smile:
Попробуйте так:
Код:
#Include <WinAPIEx.au3>
#include <GuiToolbar.au3>
#include <ToolbarConstants.au3>

$hWnd = WinGetHandle("[CLASS:TfrmMainArm]")
$hToolBar = ControlGetHandle($hWnd, "", "[CLASS:TTBXToolbar; INSTANCE:1]")
$iCommand = _GUICtrlToolbar_IndexToCommand($hToolBar, 0) ; или, в место '0' попробуйте '11'
_SendMessage($hToolBar, $WM_COMMAND, $iCommand, $hToolBar)
 

amorph

Новичок
Сообщения
12
Репутация
2
хмм, может и глупость, но мне в одном случае помогло...
если для этой кнопки есть хоткей (или его можно задать), можно его посылать.
 
Верх