1 (изменено: Poltergeyst, 2011-08-07 18:54:55)

Тема: AutoIt v3; LangMF 8.0: Работа с панелью инструментов ToolbarWindow32

Без гарантий. Используете на свой страх и риск.

Пример создания простейшей стандартной панели инструментов ToolbarWindow32 с кнопками.
Lang: AutoIt3.
OC WinMe/XP

Post's attachments

Toolbar32g2.zip 14.11 kb, 330 downloads since 2010-02-01 

You don't have the permssions to download the attachments of this post.

2 (изменено: Poltergeyst, 2011-08-07 21:03:42)

Re: AutoIt v3; LangMF 8.0: Работа с панелью инструментов ToolbarWindow32

Без гарантий. Используете на свой страх и риск.

Скрипт предназначен для перечисления кнопок заданной панели инструментов ToolbarWindow32 произвольного внешнего окна, а также для эмуляции нажатия(программного нажатия) заданной кнопки этой панели. В файле настроек [tbclick.ini], который должен располагаться рядом со скриптом, укажите заголовок(или часть заголовка) необходимого родительского окна, а также идентификатор дочерней панели инструментов. Чтобы узнать эти параметры можно воспользоваться утилитой типа AU3SPY. Сначала запустите оконное приложение с панелью инструментов, а затем запустите скрипт. В списке формы скрипта будут отображены кнопки выбранной панели инструментов. Укажите метод нажатия кнопки панели путем простановки опции "Нажать через сообщение WM_COMMAND" или "Нажать через эмуляцию клика мыши". Далее выберите нужную вам кнопку в списке и нажмите "Нажать кнопку на панели". Чтобы перечислить кнопки выбранной панели нажмите "Перечислить кнопки панели". Перечисление сопровождается перемещением курсора мыши на область кнопки панели инструментов, а также контрольным сообщением.

Примечание:
1] Скрипт работает только со стандартными Win-панелями инструментов ToolbarWindow32 и не работает с панелями другого класса.

2] Нажатие кнопки через сообщение WM_COMMAND может не срабатывать даже со стандартными панелями, поэтому нажатие через эмуляцию клика мыши более гарантировано.

Lang: AutoIt3.
Тестировалось на OC WinMe

Данный скрипт тестировался на ОС WinMe/AutoIt 3.1. К сожалению выяснилось, что нельзя гарантировать работоспособность данного скрипта на других операционных системах в сочетаниях с иными версиями интерпретатора AutoIt.

Post's attachments

tool32clc.zip 7.2 kb, 340 downloads since 2010-02-01 

You don't have the permssions to download the attachments of this post.

3 (изменено: Poltergeyst, 2011-08-07 21:04:34)

Re: AutoIt v3; LangMF 8.0: Работа с панелью инструментов ToolbarWindow32

Без гарантий. Используете на свой страх и риск.

LangMF-скрипт предназначен для эмуляции нажатия(программного нажатия) заданной кнопки панели инструментов ToolbarWindow32. Чтобы узнать идентификатор панели инструментов, можно воспользоваться утилитой AU3SPY. Сначала запустите оконное приложение с панелью  инструментов(в данном примере это WordPad), а затем запустите скрипт. В поле запроса укажите номер кнопки, которую требуется нажать:
- Ok - нажатие кнопки,
- Отмена - завершение работы скрипта.

Скрипт работает только со стандартными Win-панелями инструментов ToolbarWindow32 и не работает с панелями другого класса.

Потребуется установленный LangMF 8.0:
http://atombyte.com/prog.htm?oper=katal … 3&vi=1
http://www.script-coding.com/LangMF.html

Потребуется установленная библиотека AutoItX3.
Тестировалось на ОС WinXP.

'--------------------------------------------------------------------
' Скрипт предназначен для эмуляции нажатия(программного нажатия) заданной кнопки 
' панели инструментов ToolbarWindow32. Чтобы узнать идентификатор панели инструментов, 
' можно воспользоваться утилитой AU3SPY. Сначала запустите оконное приложение с панелью 
' инструментов(в данном примере это WordPad), а затем запустите скрипт. В поле запроса 
' укажите номер кнопки, которую требуется нажать: 
' - Ok - нажатие кнопки,
' - Отмена - завершение работы скрипта.
'
' Скрипт работает только со стандартными Win-панелями инструментов ToolbarWindow32 и не 
' работает с панелями другого класса.
'--------------------------------------------------------------------
' Потребуется установленный LangMF 8.0
'    http://atombyte.com/prog.htm?oper=katalog&id=3&vi=1 
'    http://www.script-coding.com/LangMF.html 
' Потребуется установленная библиотека AutoItX3    (http://www.script-coding.info/AutiItX.html)
'
' ОС WinXP
'--------------------------------------------------------------------

<#Module=ToolBarBtn>

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' //Измените эти два параметра при необходимости://
' 1) //ЗАГОЛОВОК ОКНА//
 Private Const MyTitle = "WordPad"

' 2) //ИДЕНТИФИКАТОР ПАНЕЛИ ИНСТРУМЕНТОВ//
 Private Const MyBarClass = "ToolbarWindow322"
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


'/Структура LPCTBBUTTON кнопки панели ToolBarWindow32/
'--------------------------------------------------------------------
Private Type LPCTBBUTTON
iBitmap As Long
idCommand As Long
fsState As Byte
fsStyle As Byte
bReserved1 As Byte
bReserved2 As Byte
dwData As Long
iString As Long
End Type

Private Type PROCESSID
iProcess As Integer
End Type

 Dim pLPCTBBUTTON As LPCTBBUTTON
'--------------------------------------------------------------------
 Private Const WM_COMMAND = &H0111
'--------------------------------------------------------------------
 Private Const PROCESS_TERMINATE = 1
 Private Const PROCESS_CREATE_THREAD = 2
 Private Const PROCESS_SET_SESSIONID = 4
 Private Const PROCESS_VM_OPERATION = 8
 Private Const PROCESS_VM_READ = &H10
 Private Const PROCESS_VM_WRITE = &H20
 Private Const PROCESS_DUP_HANDLE = &H40
 Private Const PROCESS_CREATE_PROCESS = &H80
 Private Const PROCESS_QUERY_INFORMATION = &H400
'--------------------------------------------------------------------
 Private Const PAGE_NOACCESS = 1
 Private Const PAGE_READONLY= 2 
 Private Const PAGE_READWRITE = 4
 Private Const PAGE_WRITECOPY = 8
 Private Const PAGE_EXECUTE = &H10
 Private Const PAGE_EXECUTE_READ = &H20
 Private Const PAGE_EXECUTE_READWRITE = &H40
 Private Const PAGE_EXECUTE_WRITECOPY = &H80
 Private Const PAGE_GUARD = &H100
 Private Const PAGE_NOCACHE = &H200
'--------------------------------------------------------------------
 Private Const MEM_COMMIT = &H1000
 Private Const MEM_RESERVE = &H2000
 Private Const MEM_DECOMMIT = &H4000
 Private Const MEM_RELEASE = &H8000
 Private Const MEM_FREE = &H10000
 Private Const MEM_PRIVATE = &H20000
 Private Const MEM_MAPPED = &H40000
 Private Const MEM_RESET = &H80000
 Private Const MEM_TOP_DOWN = &H100000
'--------------------------------------------------------------------
 Private Const WM_USER = &H0400
 Private Const CMB_MASKED = &H02 
 Private Const TBSTATE_CHECKED = &H01
 Private Const TBSTATE_PRESSED = &H02
 Private Const TBSTATE_ENABLED = &H04
 Private Const TBSTATE_HIDDEN = &H08
 Private Const TBSTATE_INDETERMINATE = &H10
 Private Const TBSTATE_WRAP = &H20 
 Private Const TBSTYLE_BUTTON = &H00
 Private Const TBSTYLE_SEP = &H01
 Private Const TBSTYLE_CHECK = &H02
 Private Const TBSTYLE_GROUP = &H04
 Private Const TBSTYLE_TOOLTIPS = &H0100
 Private Const TBSTYLE_WRAPABLE = &H0200
 Private Const TBSTYLE_ALTDRAG = &H0400 
'--------------------------------------------------------------------
 TB_ENABLEBUTTON = WM_USER + 1
 TB_CHECKBUTTON = WM_USER + 2
 TB_PRESSBUTTON = WM_USER + 3
 TB_HIDEBUTTON = WM_USER + 4
 TB_INDETERMINATE = WM_USER + 5
 TB_ISBUTTONENABLED = WM_USER + 9
 TB_ISBUTTONCHECKED = WM_USER + 10
 TB_ISBUTTONPRESSED = WM_USER + 11
 TB_ISBUTTONHIDDEN = WM_USER + 12
 TB_ISBUTTONINDETERMINATE = WM_USER + 13
 TB_SETSTATE = WM_USER + 17
 TB_GETSTATE = WM_USER + 18
 TB_ADDBITMAP = WM_USER + 19
 TB_ADDBUTTONS = WM_USER + 20
 TB_INSERTBUTTON = WM_USER + 21
 TB_DELETEBUTTON = WM_USER + 22
 TB_GETBUTTON = WM_USER + 23
 TB_BUTTONCOUNT = WM_USER + 24
 TB_COMMANDTOINDEX = WM_USER + 25
 TB_SAVERESTOREA = WM_USER + 26
 TB_SAVERESTOREW = WM_USER + 76
 TB_CUSTOMIZE = WM_USER + 27
 TB_ADDSTRINGA = WM_USER + 28
 TB_ADDSTRINGW = WM_USER + 77
 TB_GETITEMRECT = WM_USER + 29
 TB_BUTTONSTRUCTSIZE = WM_USER + 30
 TB_SETBUTTONSIZE = WM_USER + 31
 TB_SETBITMAPSIZE = WM_USER + 32
 TB_AUTOSIZE = WM_USER + 33
 TB_GETTOOLTIPS = WM_USER + 35
 TB_SETTOOLTIPS = WM_USER + 36
 TB_SETPARENT = WM_USER + 37
 TB_SETROWS = WM_USER + 39
 TB_GETROWS = WM_USER + 40
 TB_SETCMDID = WM_USER + 42
 TB_CHANGEBITMAP = WM_USER + 43
 TB_GETBITMAP = WM_USER + 44
 TB_GETBUTTONTEXTA = WM_USER + 45
 TB_GETBUTTONTEXTW = WM_USER + 75
 TB_REPLACEBITMAP = WM_USER + 46
 TB_SETINDENT = WM_USER + 47
'--------------------------------------------------------------------
 Private ObjAu
 Private hOpen
 Private hMem
 Private hwnd
 Private cHwnd
 Private bCount

'--------------------------------------------------------------------
Sub Load(command)


    '/Создание AutoItX3.Control/
    '------------------------------------------------------------
    Err.Clear
    On Error Resume Next
    Set ObjAu = CreateObject("AutoItX3.Control")
    If Err.Number<>0 Then 
        MsgBox "Требуется AutoItX.DLL.", vbExclamation + vbSystemModal, "Error"
        EndMF
        Exit Sub
    End If
    On Error GoTo 0
    '------------------------------------------------------------
    ObjAu.Opt "WinTitleMatchMode",2


    '/Поиск окна с заданным заголовком/
    '------------------------------------------------------------
    '------------------------------------------------------------
    r = ObjAu.WinGetHandle(MyTitle,"")
    If Len(r)=0 Then 
        MsgBox "Не найдено окно с заголовком " & MyTitle & ". Запустите WordPad.", vbSystemModal + vbExclamation,"Error"
        EndMF
        Exit Sub
    End If
    hwnd = CLng("&H" & r)
    
    '/Поиск панели инструментов с заданным идентификатором/
    '------------------------------------------------------------
    r = ObjAu.ControlGetHandle(MyTitle,"",MyBarClass)
    If Len(r)=0 Then 
        MsgBox "Не найден элемент управления.", vbSystemModal + vbExclamation,"Error"
        EndMF
        Exit Sub
    End If
    cHwnd = CLng("&H" & r)


    '/Определение ID внешнего процесса/
    '------------------------------------------------------------
    '------------------------------------------------------------
    Dim PID As PROCESSID
    hThread    =Sys.DynApi.CallFunction( _
                    "USER32.DLL", _
                    "GetWindowThreadProcessId", _
                    hwnd, _
                    PID)
    If hThread = 0 Then 
        MsgBox "Не удалось получить PID.", vbSystemModal + vbExclamation,"Error"
        EndMF
        Exit Sub
    End If
    
    '/Открыть внешний процесс/
    '------------------------------------------------------------    
    hOpen = Sys.DynApi.CallFunction( _
                    "KERNEL32.DLL", _
                    "OpenProcess", _
                    PROCESS_VM_OPERATION + PROCESS_VM_WRITE + PROCESS_VM_READ, _
                    False, _
                    PID.iProcess)

    If hOpen = 0 Then 
        MsgBox "Не удалось получить доступ к процессу.", vbExclamation + vbSystemModal, "Error"
        EndMF
        Exit Sub
    End If

    '/Выделение памяти внешнего процесса под структуру LPCTBBUTTON кнопки панели ToolBarWindow32/
    '-------------------------------------------------------------
    hMem = Sys.DynApi.CallFunction( "KERNEL32.DLL", _
                    "VirtualAllocEx", _
                    hOpen, _
                    0, _
                    LenType(pLPCTBBUTTON), _
                    MEM_RESERVE + MEM_COMMIT, _
                    PAGE_EXECUTE_READWRITE)

    '/Активировать окно внешнего процесса, подсчитать количество кнопок панели инструментов/
    '------------------------------------------------------------
    '------------------------------------------------------------
    ObjAu.WinActivate MyTitle,""
    Sys.cSleep(200)
    
    bCount = Sys.API.SendMessage(cHwnd, TB_BUTTONCOUNT, 0, 0)
    MsgBox "Количество кнопок панели инструментов " & MyBarClass & ": " & bCount, vbInformation + vbSystemModal, "Toolbar"

    '/Рекурсивный вызов нажатия указанной кнопки/
    PushToolBarButton 0    

    '/Закрытие дескриптора внешнего процесса перед выходом из скрипта/
    '------------------------------------------------------------
    res = Sys.DynApi.CallFunction( _
                    "KERNEL32.DLL", _
                    "CloseHandle", _
                    hOpen)

    
    EndMF
End Sub

'[Рекурсивный вызов нажатия указанной кнопки панели инструментов]
'--------------------------------------------------------------------
Sub PushToolBarButton(iDef)
    

    '/Запрос на указание номера кнопки панели инструментов, которую требуется нажать/
    '------------------------------------------------------------
    iBtn = Sys.InputBox2("Укажите номер кнопки панели инструментов "& MyBarClass &", которую требуется нажать, от 0 до " & bCount-1 & ":","Toolbar",iDef)
    Sys.cSleep(200)
    If Len(iBtn)=0 Then Exit Sub

    Err.Clear
    On Error Resume Next
    iBtn = CInt(iBtn)
    If Err.Number<>0 Then 
        MsgBox "Неправильный формат данных.", vbExclamation + vbSystemModal, "Error"
        PushToolBarButton iDef
    Exit Sub
    End If
    On Error GoTo 0

    If iBtn > bCount-1 Then 
        MsgBox "Слишком большой номер кнопки.", vbExclamation + vbSystemModal, "Error"
        PushToolBarButton iDef
        Exit Sub
    End If

    '/Получение структуры-описателя кнопки в памяти внешнего процесса/
    '------------------------------------------------------------
    res = Sys.API.SendMessage(cHwnd, TB_GETBUTTON, iBtn, hMem)
    
    '//Извлечение данных структуры-описателя кнопки из памяти внешнего процесса//
    '------------------------------------------------------------
    hRes = Sys.DynApi.CallFunction( "KERNEL32.DLL", _
                    "ReadProcessMemory", _
                    hOpen, _
                    hMem, _
                    pLPCTBBUTTON, _
                    LenType(pLPCTBBUTTON), _
                    0)    

    '/Проверка стиля кнопки - сепаратор ли это?/
    '------------------------------------------------------------
    If pLPCTBBUTTON.fsStyle And TBSTYLE_SEP Then 
        MsgBox "Кнопка " & iBtn & " сепаратор.", vbExclamation + vbSystemModal, "Error"
        PushToolBarButton iDef
        Exit Sub
    End If

    '/Нажатие указанной кнопки панели инструментов/
    '------------------------------------------------------------
    res = Sys.API.SendMessage(hwnd, WM_COMMAND, pLPCTBBUTTON.idCommand, cHwnd)

    PushToolBarButton iBtn

End Sub
<#Module>
'pltrgst