Что нового

Не нажимается кнопка на 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 319
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 319
MiOksa,
Покажите скриншот Вашего TTBXToolbar и укажите на какую кнопку надо нажать.
 
Автор
M

MiOksa

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

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
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 319
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 319
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 319
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 319
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
Репутация
964
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)
 
Автор
M

MiOksa

Новичок
Сообщения
12
Репутация
0
Тоже без результатно(
 

amorph

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