Loopback
|
Posted: Tue Aug 10, 2010 13:36 Post subject: |
|
|
HA3APET
В принципе Гислер прав, нет никакой возможности однозначно определить расположение нужной вкладки на разных языках.
Однако, если остановиться на каком-нибудь одном языке, можно пройти по всем вкладкам, получить их заголовки и перейти на нужную.
Скрипт ниже (разумеется, Autoit) это и делает для русского языка. Довольно развесистый, что связано со сложностью получения заголовка таба в другом процессе. Требует модуль Memory.au3, который входит в стандартный дистрибутив Autoit.
При запуске в Vista/7 открывает диалог свойств и переходит на нужную закладку, в других ОС - вызывает стандарную функцию тотала.
Code: |
#include <Memory.au3>
Global $hWnd = _TCHGetActiveInstance()
Global Const $cm_Properties=1003
Global Const $cm_EditPermissionInfo=2200
Global Const $TC_SENDMESSAGE = 0x400 + 51
Global Const $TCM_FIRST = 0x1300
Global Const $TCM_GETITEMW = ($TCM_FIRST + 60)
Global Const $TCM_GETITEMCOUNT = ($TCM_FIRST + 4)
Global Const $TCIF_TEXT = 0x1
If Not ((@OSVersion = "WIN_7") Or (@OSVersion = "WIN_VISTA")) Then
__TCHSendMessage($hWnd, $TC_SENDMESSAGE, $cm_EditPermissionInfo)
Exit
EndIf
__TCHSendMessage($hWnd, $TC_SENDMESSAGE, $cm_Properties)
$WinWnd = WinWait("Свойства:", "", 5)
$TabWnd = ControlGetHandle($WinWnd, "", "SysTabControl321")
$nCount = __TCHSendMessage($TabWnd, $TCM_GETITEMCOUNT, 0, 0)
For $i = 0 To $nCount-1
$sText = _TabGetItemText($TabWnd, $i)
If $sText = "Безопасность" Then
For $j = 0 To $i - 1
ControlCommand($WinWnd, "", $TabWnd, "TabRight", "")
Next
Exit
EndIf
Next
; Вспомогательные функции
Func __TCHSendMessage($hWnd, $nMsg, $wParam = 0, $lParam = 0)
Local $aResult = DllCall("user32.dll", "int", "SendMessage", "hwnd", $hWnd, "int", $nMsg, "wparam", $wParam, "lparam", $lParam)
If @error Then Return SetError(@error, @extended, "")
Return $aResult[0]
EndFunc
Func _TCHGetActiveInstance()
Local $aList = WinList("[CLASS:TTOTAL_CMD]")
For $i = 1 To $aList[0][0]
If WinActive($aList[$i][1]) Then Return $aList[$i][1]
Next
Return 0
EndFunc
Func _TabGetItemText($hWnd, $iIndex)
Local $iBuffer = 1024, $iMaxPtrSize = 8
Local $tItem = DllStructCreate("uint Mask;dword State;dword StateMask;ptr Text;int TextMax;int Image;lparam Param")
Local $pItem = DllStructGetPtr($tItem)
Local $iItem = DllStructGetSize($tItem)
DllStructSetData($tItem, "Mask", $TCIF_TEXT)
DllStructSetData($tItem, "TextMax", $iBuffer)
Local $tBuffer = DllStructCreate("wchar Text[" & $iBuffer & "]")
Local $pBuffer = DllStructGetPtr($tBuffer)
Local $tMemMap
Local $pMemory = _MemInit($hWnd, $iItem + $iBuffer * 2 + $iMaxPtrSize, $tMemMap)
Local $pText = $pMemory + $iItem + $iMaxPtrSize
DllStructSetData($tItem, "Text", $pText)
_MemWrite($tMemMap, $pItem, $pMemory, $iItem)
Local $iRet = __TCHSendMessage($hWnd, $TCM_GETITEMW, $iIndex, $pMemory)
_MemRead($tMemMap, $pText, $pBuffer, $iBuffer)
_MemFree($tMemMap)
Return DllStructGetData($tBuffer, "Text")
EndFunc
|
|
|