Что нового

Как можно переключиться на нужную вкладку зная заголовки вкладок

bigarN

Новичок
Сообщения
50
Репутация
0
Привет Ребята !!!
По форуму не смог достать нужную инфу и прошу вас о помощи.
Вопрос заключается в следующем: В Фотошопе есть вкладки Actions ( Операции) и History ( История) и.т.д
Надо выяснить
- какая вкладка видимая
- и как зная заголовки вкладок переключиться на нужную вкладку
Вот , как смог написал. Прошу сильно не пинать
Код:
HotKeySet('{Esc}','_Exit')
$sTitle="Adobe Photoshop CS3"
WinWait($sTitle)
If Not WinActive($sTitle) Then WinActivate($sTitle)
WinWaitActive($sTitle)
While 1
Sleep(1000)
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
$hWnd = WinGetHandle($sTitle) ; 0x011C02E2
$hWndTabGroup = WinGetHandle("[CLASS:OWL.TabGroup]") ;0x003C0BF2

$sTabName = ControlGetText($hWndTabGroup, "", "[CLASS:OWL.Palette; INSTANCE:1]") ; Actions или Операции
$hTab = ControlGetHandle($hWndTabGroup,"","[CLASS:OWL.Palette; INSTANCE:1]") ; 0x004B0B98

$sTabName2= ControlGetText($hWndTabGroup, "", "[CLASS:OWL.Palette; INSTANCE:2]") ; History или История
$hTab2 = ControlGetHandle($hWndTabGroup,"","[CLASS:OWL.Palette; INSTANCE:2]") ; 0x00200BDA

ToolTip('    Exit (  Esc  )'& @CRLF & " 1.hWnd --- "& $hWnd & @CRLF & " 2.hWndTabGroup --- " & $hWndTabGroup & @CRLF & " 3.TabName --- " & $sTabName & @CRLF & " 4.Tab --- " & $hTab & @CRLF & " 5.TabName2 --- " & $sTabName2 & @CRLF & " 6.Tab2 --- " & $hTab2 )
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

WEnd

Func _Tabs()
	  Switch @HotKeyPressed
		Case "{F2}"

		;переключаемся на вкладку History ( История )
			MsgBox(64, 'Title', " History ( История ) pressed  ",1)

	    Case "{F3}"
		;переключаемся на вкладку Actions ( Операции )
            MsgBox(64, 'Title', " Actions ( Операции ) pressed  ",1)

    EndSwitch

EndFunc
Func _Exit()
	Exit
EndFunc


А вот что выдал AutoIt Window Info
>>>> Window <<<<
Title:
Class: OWL.TabGroup
Position: 662, 137
Size: 206, 229
Style: 0x96000000
ExStyle: 0x08000000
Handle: 0x000109CA

>>>> Control <<<<
Class: PSViewC
Instance: 1
ClassnameNN: PSViewC1
Name:
Advanced (Class): [CLASS:blum:SViewC; INSTANCE:1]
ID:
Text:
Position: 0, 0
Size: 206, 229
ControlClick Coords: 117, 119
Style: 0x56020000
ExStyle: 0x00000000
Handle: 0x000109D2

>>>> Mouse <<<<
Position: 779, 256
Cursor ID: 0
Color: 0xEDEDED

>>>> StatusBar <<<<

>>>> ToolsBar <<<<

>>>> Visible Text <<<<
Операции

>>>> Hidden Text <<<<
История

За ранее благодарен и выражаю особую благодарность всем кто поможет
 

StarEdik

Новичок
Сообщения
365
Репутация
4
bigarN
Тема для меня тоже интересно. Если только для себя будете использовать можно так
Код:
MouseClick("Left",700,163,1,10);History 
MouseClick("Left",770,163,1,10);Actions

Естественно координаты должны быть другими.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
bigarN,
У меня не установлен Photoshop, но, если это элемент Tab, то пример:
1. Создаем для примера окно с Tab:
Код:
#include <GUIConstantsEx.au3>

$hGui = GUICreate('Test Tab', 400, 200, 10, 10)
$nTab = GUICtrlCreateTab(10, 10, 380, 180)
For $i = 1 To 5
	GUICtrlCreateTabItem('TabItem ' & $i)
	GUICtrlCreateLabel('TabItem index ' & $i - 1, 50, 50, 150, 20)
Next
GUISetState()
$iRandom = Random(0, 4, 1)
If $iRandom Then
	For $i = 1 To $iRandom
		ControlCommand($hGui, '', $nTab, 'TabRight')
	Next
EndIf
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd
Запускаем скрипт.
2. Обрабатываем Tab или так (ИМХО, надежнее).
Код:
;по номеру:
$iNum_Tab = 3 ;открываем вкладку 3 (ее индекс 2).
$hWin = WinWait('[Title:Test Tab; Class:AutoIt v3 GUI]', '', 5)
If Not $hWin Then
	MsgBox(16, 'Error', 'No Window')
	Exit
EndIf
$hTab = ControlGetHandle($hWin, '', '[CLASS:SysTabControl32; INSTANCE:1]')
If Not $hTab Then
	MsgBox(16, 'Error', 'ControlGetHandle')
	Exit
EndIf
$iNow_Tab = ControlCommand($hWin, '', $hTab, 'CurrentTab')
If $iNow_Tab <> $iNum_Tab Then
	Switch $iNow_Tab
		Case $iNow_Tab < $iNum_Tab
			For $i = 1 To $iNum_Tab - $iNow_Tab
				ControlCommand($hWin, '', $hTab, 'TabRight')
			Next
		Case $iNow_Tab > $iNum_Tab
			For $i = 1 To $iNow_Tab - $iNum_Tab
				ControlCommand($hWin, '', $hTab, 'TabLeft')
			Next
	EndSwitch
	If ControlCommand($hWin, '', $hTab, 'CurrentTab') = $iNum_Tab Then
		MsgBox(64, 'Info', 'OK')
	Else
		MsgBox(16, 'Error', 'Error')
	EndIf
Else
	MsgBox(64, 'Info', 'Уже')
EndIf

Или так.
Код:
#include <GuiTab.au3>

;по заголовку:
$sNum_Tab = 'TabItem 3' ;открываем вкладку TabItem 3.
$hWin = WinWait('[Title:Test Tab; Class:AutoIt v3 GUI]', '', 5)
If Not $hWin Then
	MsgBox(16, 'Error', 'No Window')
	Exit
EndIf
$hTab = ControlGetHandle($hWin, '', '[CLASS:SysTabControl32; INSTANCE:1]')
If Not $hTab Then
	MsgBox(16, 'Error', 'ControlGetHandle')
	Exit
EndIf
$iFindTab = _GUICtrlTab_FindTab($hTab, $sNum_Tab)
If $iFindTab >= 0 Then
	_GUICtrlTab_ClickTab($hTab, $iFindTab);будет работать только если заголовки вкладок видны 
Else
	MsgBox(16, 'Error', '_GUICtrlTab_FindTab')
EndIf
 
Автор
B

bigarN

Новичок
Сообщения
50
Репутация
0
madmasles
Очен хороший пример.А почему с редактора сразу 2 скрипта запускать не разрешается. После теста и сообщу о своих достижениях. Спасибо.



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

madmasles
Врод б с примерами кое как разобрался .В примере при $sNum_Tab = 'TabItem 1' выдается ошибка'Error', '_GUICtrlTab_FindTab. А вот эти пресловутые вкладки из Фотошопа .
 
Автор
B

bigarN

Новичок
Сообщения
50
Репутация
0
madmasles
ОК :ok:.Спасибо с примерами разобрался. ;D Но вот в Фотошопе вместо этого( [CLASS:SysTabControl32; INSTANCE:1] ) класса что взят не знаю. :wacko:
 

Dm666

Осваивающий
Сообщения
220
Репутация
48
Вообще, странные эти табы. Нестандартные.
Код:
$t = ControlGetText("[CLASS:OWL.TabGroup]","","[CLASS:OWL.Palette; INSTANCE:1]") ; 1-Act 
$t1 = ControlGetText("[CLASS:OWL.TabGroup]","","[CLASS:OWL.Palette; INSTANCE:2]") ; 2-his

четко возвращает Actions и History соответственно.
Код:
MsgBox (0,"",ControlClick("[CLASS:OWL.TabGroup]","","[CLASS:OWL.Palette; INSTANCE:1]"))

возвращает 1, но клика не происходит. Уж и активным окно делал, и IsVisible ему, и IsEnabled - все равно не кликает.
Остается только кликать по координатам..
 
Автор
B

bigarN

Новичок
Сообщения
50
Репутация
0
Dm666
Спасибо за ответ. Вы старались и это много для меня значить. Проверю и сообщу
StarEdik
Проверил. Правда с координатами повозился. Получилось кликать на вкладках.А вот когда я ширину вкладок изменил тогда скрипт на пустом месте кликал. Значит эти координаты не те.Пробовал так.
GUICtrlTab_ClickTab($hWndTab, 0)
Ну это кликание на вкладке а надо на заголовке.
 

Dm666

Осваивающий
Сообщения
220
Репутация
48
В общем, кое-что получилось, пробуйте:
Код:
WinActivate("[CLASS:OWL.TabGroupCluster]")
Local $aPos[4]
$aPos = WinGetPos ("[CLASS:OWL.TabGroupCluster]")
If @error Then
    MsgBox(0,"Error", "Can't find Window")
    Exit
EndIf

If WinGetState("[CLASS:OWL.TabGroupCluster]") <> 7 Then ; Check window is docked
    MsgBox(0,"Error","Window doesnt exist or docked"& @CRLF & "Move window left to the workspace")
    Exit
EndIf

;BlockInput(1)
If ControlCommand("[CLASS:OWL.TabGroup]","","[CLASS:OWL.Palette; INSTANCE:2]","IsVisible", "") = 1 Then ; History active
    MouseClick("",$aPos[0]+85,$aPos[1]+20,1,1) ; Act
Else
    MouseClick("",$aPos[0]+30,$aPos[1]+20,1,1) ;His
EndIf
;BlockInput(0)


Только есть одно "но":
- Чтобы все это безобразие начало работать, окно не должно быть пристыковано к правой боковой панели... Надеюсь понятно выразился. ;) Не знаю почему, но по-другому не работает. Это проверяется вторым IF-ом, можно и убрать, но тогда будет кликать по пустому месту
 
Автор
B

bigarN

Новичок
Сообщения
50
Репутация
0
Dm666

Dm666 [?]
Чтобы все это безобразие начало работать,
Спасибо.Это не безобразие а неоценимый труд.Я наверно вас в затруднил. Очень извиняюсь. То что вы сделали никто еще не предлагал. Так что буду работать дальше. Потестирую и сообщу. С вас тоже прозба . Если что прошу оставить сообщение. Буду очень рад. Наверно кто нить еще что та предложить. На кнопке сейчас почти каждый может кликать а на таких контролях не всякие . :smile:
 

StarEdik

Новичок
Сообщения
365
Репутация
4
Dm666
Да, он прав .Вы сделали что смогли.Я тоже проверил. Как только отстыковал табы ,сразу мышка побежала к табам и кликнула по нужному.
 

Dm666

Осваивающий
Сообщения
220
Репутация
48
Я наверно вас в затруднил. Очень извиняюсь
Да нет проблем. Просто Photoshop под рукой оказался. Жаль что его нет, например, у madmasles. Уверен, решение было бы намного элегантнее и эффективнее :smile:

PS: Чуть подправил скрипт, чтобы кликал поживее. При таком раскладе BlockInput оказался ненужным
 
Автор
B

bigarN

Новичок
Сообщения
50
Репутация
0
Dm666
Спасибо тебе за то что исправил . :ok:Я наглядно видел как мышь торопится к контролю.Тепер придется повозится с стыковкой. Это проблема у многих может возникнут.Только в Фотошопе что ли есть.В других приложениях наверно тоже есть такие контроли .А модератор madmasles хороший человек, отзывчивый. Ну что поделать у него нет Фотошопа. Ну наверно кто нить разберется с этими контролями и напишет нам. Удачи нам всем. :smile:
 

StarEdik

Новичок
Сообщения
365
Репутация
4
bigarN
А модератор madmasles хороший человек, отзывчивый.
Но и благородный , умный и знаток своего дела.
Dm666 [?]
Жаль что его нет, например, у madmasles. Уверен, решение было бы намного элегантнее и эффективнее
Это точно.

PS
ИМХО. Я знаю кто вам (мне тоже ) может помочь. Он мне помогал. У него точно есть Фотошоп. Наверно он смотрит , и надеюсь будет снисходителен и ответить. :smile:
 

Dm666

Осваивающий
Сообщения
220
Репутация
48
Вот, решил зайти немного с другой стороны. Теперь должно работать не только если окошко отцеплено, но и если оно пристыковано к правому краю, как в получается после активации WorkSpace->Default View.
Не работает (пока? ;) ) только если окно сделать частью правой панели, "встроить" в нее.
Код:
Opt("WinDetectHiddenText", 1)   ;0=don't detect, 1=do detect
Local $sClass = "[CLASS:OWL.TabGroup]"
WinActivate($sClass,"Actions")

If WinGetState($sClass,"Actions") <> 7 Then ;
    MsgBox(0,"Error","Window doesnt exist or docked")
    Exit
EndIf
$aPos = WinGetPos ($sClass)

If ControlCommand($sClass,"","[CLASS:OWL.Palette; INSTANCE:2]","IsVisible", "") = 1 Then ; History active
    MouseClick("",$aPos[0]+85,$aPos[1]-10,1,1) ; Act
Else
    MouseClick("",$aPos[0]+30,$aPos[1]-10,1,1) ;His
EndIf
 
Автор
B

bigarN

Новичок
Сообщения
50
Репутация
0
Dm666
Спасибо вам . :smile:Вы преуспели многих ( +1).Вас нельзя новичком называть.
Проверил , кое что добавил и кое что отменил.Без этих отмен у меня выдавался ощибка.Проверте плз мои ощибки.
Код:
Opt("WinDetectHiddenText", 1)   ;0=don't detect, 1=do detect
HotKeySet('{F2}','_Tabs')
HotKeySet('{Esc}','_Exit')

$sTitle="Adobe Photoshop CS3"
WinWait($sTitle)
If Not WinActive($sTitle) Then WinActivate($sTitle)
WinWaitActive($sTitle)

While 1
	Sleep(100)
WEnd

Func _Tabs()

Local $sClass = "[CLASS:OWL.TabGroup]"
  WinActivate($sClass,"Actions")

   If WinGetState($sClass,"Actions") <> 7 Then ;
     ; MsgBox(0,"Error","Window doesnt exist or docked")
     ; Exit
   EndIf
$aPos = WinGetPos ($sClass)

 If ControlCommand($sClass,"","[CLASS:OWL.Palette; INSTANCE:2]","IsVisible", "") = 1 Then ; History active
    MouseClick("",$aPos[0]+85,$aPos[1]-10,1,1) ; Act
 Else
    MouseClick("",$aPos[0]+30,$aPos[1]-10,1,1) ;His
EndIf

EndFunc

Func _Exit()
	Exit
EndFunc

Вот тоже интересная тема почти сходной задачей http://autoit-script.ru/index.php/topic,2896.msg20965.html#msg20965
 

Dm666

Осваивающий
Сообщения
220
Репутация
48
Поправил еще чуть-чуть. Недоглядел пару моментов :(
Код:
Opt("WinDetectHiddenText", 1) ;0=don't detect, 1=do detect
HotKeySet('{F2}', '_Tabs')
HotKeySet('{Esc}', '_Exit')

$sTitle = "Adobe Photoshop CS3"
WinWait($sTitle)
If Not WinActive($sTitle) Then WinActivate($sTitle)
WinWaitActive($sTitle)

While 1
	Sleep(100)
WEnd

Func _Tabs()

	Local $sClass = "[CLASS:OWL.TabGroup]"
	WinActivate($sClass, "Actions")
	If WinGetState($sClass, "Actions") = 13 Then Return ; Do nothing if window inaccessable
	
	$aPos = WinGetPos($sClass, "Actions")
	If Not IsArray ($aPos) Then 
		MsgBox(16,"Error", "Cant find window")
		Return
	EndIf	
	If ControlCommand($sClass, "Actions", "[CLASS:OWL.Palette; INSTANCE:2]", "IsVisible", "") = 1 Then ; History active
		MouseClick("", $aPos[0] + 85, $aPos[1] - 10, 1, 1) ; Act
	Else
		MouseClick("", $aPos[0] + 30, $aPos[1] - 10, 1, 1) ;His
	EndIf

EndFunc   ;==>_Tabs

Func _Exit()
	Exit
EndFunc   ;==>_Exit

Теперь вроде работает вообще везде, проверяйте.

А за ссылку спасибо, посмотрю после работы.
 
Автор
B

bigarN

Новичок
Сообщения
50
Репутация
0
Dm666 :smile:
Вот такую ошибку выдал

Subscript used with non-Array variable.:
MouseClick("", $aPos[0] + 30, $aPos[1] - 10, 1, 1)
MouseClick("", $aPos^ ERROR
 

Dm666

Осваивающий
Сообщения
220
Репутация
48
bigarN
Вот такую ошибку выдал
Странно, у меня не повторяется. Вернее, повторяется, но только если Photoshop выключить, что кажется нелогичным :whistle:
Но так действительно правильнее, исправлено.
 
Верх