Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: Кнопка вызова "Свойства - Безопасность" объекта под курсором 
Author Message
Loopback



PostPosted: Tue Aug 10, 2010 13:36    Post subject: Reply with quote

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
View user's profile Send private message


Powered by phpBB © 2001, 2005 phpBB Group