Malicious Office (OOXML) — malware analysis report

Static analysis result for SHA-256 d7369e9e6d793326…

MALICIOUS

Office (OOXML)

119.6 KB Created: 2010-05-28 17:15:00 UTC Authoring application: Microsoft Office Word 15.0000 First seen: 2021-10-14
MD5: b7c4e780f6e6d79fab2c34d8331aeece SHA-1: 78b577dd4df695582eb06e741346fffed88e3cda SHA-256: d7369e9e6d7933267cb74ea026078ae1fd3d1c47df9346e42b23ea1c82885af1
170 Risk Score

Malware Insights

MITRE ATT&CK
T1059.005 Visual Basic T1204.002 Malicious File

The sample is an OOXML document containing a VBA project with a Document_Open macro. This macro utilizes WScript.Shell and the Shell() function, indicating an intent to execute arbitrary commands. The specific commands executed are not fully visible due to truncation, but the presence of these functions strongly suggests the download and execution of a second-stage payload.

Heuristics 6

  • VBA project inside OOXML medium 4 related findings OOXML_VBA
    Document contains a VBA project — VBA macros present
  • WScript.Shell usage critical OLE_VBA_WSCRIPT
    WScript.Shell usage
    Matched line in script
        Dim wScript
        Set wScript = CreateObject("WScript.Shell")
  • CreateObject call high OLE_VBA_CREATEOBJ
    CreateObject call
    Matched line in script
        Dim wScript
        Set wScript = CreateObject("WScript.Shell")
  • VBA p-code auto-exec with execution tokens high OLE_VBA_PCODE_AUTOEXEC_EXEC
    Compiled VBA/cache stream contains an auto-execution token together with shell/download/object-execution tokens. This catches p-code-only or source-extraction-failure macro documents where visible source is unavailable.
  • Document_Open macro low OLE_VBA_DOCOPEN
    Document_Open macro
    Matched line in script
        If Lingvo16_Installed Then
            Call Document_Open
        End If
  • Embedded URL info EMBEDDED_URL
    One or more URLs were extracted from the document. The URL itself is not a detection — see the per-URL labels for which channel (macro, JS, link annotation, document body, ...) reached each URL.
    URL http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas In document text (OOXML body / shared strings)
    • http://schemas.openxmlformats.org/markup-compatibility/2006In document text (OOXML body / shared strings)
    • http://schemas.openxmlformats.org/officeDocument/2006/relationshipsIn document text (OOXML body / shared strings)
    • http://schemas.openxmlformats.org/officeDocument/2006/mathIn document text (OOXML body / shared strings)
    • http://schemas.microsoft.com/office/word/2010/wordprocessingDrawingIn document text (OOXML body / shared strings)
    • http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawingIn document text (OOXML body / shared strings)
    • http://schemas.openxmlformats.org/wordprocessingml/2006/mainIn document text (OOXML body / shared strings)
    • http://schemas.microsoft.com/office/word/2010/wordmlIn document text (OOXML body / shared strings)
    • http://schemas.microsoft.com/office/word/2012/wordmlIn document text (OOXML body / shared strings)
    • http://schemas.microsoft.com/office/word/2010/wordprocessingGroupIn document text (OOXML body / shared strings)
    • http://schemas.microsoft.com/office/word/2010/wordprocessingInkIn document text (OOXML body / shared strings)
    • http://schemas.microsoft.com/office/word/2006/wordmlIn document text (OOXML body / shared strings)
    • http://schemas.microsoft.com/office/word/2010/wordprocessingShapeIn document text (OOXML body / shared strings)
    • http://schemas.microsoft.com/office/2006/01/customuiIn document text (OOXML body / shared strings)

Extracted artifacts 2

Files carved from inside the sample during analysis.

FilenameKindSourceSize
macros.bas vba-macro oletools.olevba.extract_macros (decoded VBA source from OOXML) 80941 bytes
SHA-256: de7e1e1350ca50616e30379bfdc6f600375642d54eed4fdd9b82e795bd758d2c
Preview script
First 1,000 lines of the extracted script
Attribute VB_Name = "ThisDocument"
Attribute VB_Base = "0{00020906-0000-0000-C000-000000000046}"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = True
Attribute VB_TemplateDerived = False
Attribute VB_Customizable = True
Private Lingvo16_Installed As Boolean
Private Lingvo16_LingvoRunning As Boolean
Private Lingvo16_Ribbon As IRibbonUI
Private Lingvo16_HeadingLanguage As Long
Private Lingvo16_ContentsLanguage As Long
Private Lingvo16_HeadingMenuLanguages
Private Lingvo16_ContentsMenuLanguages
Private Lingvo16_ShowTranslationSettings As Long
Private Lingvo16_ChangeSettings As Long
Private Lingvo16_ComboBoxValue As String
Private Lingvo16_LanguageIDs As New Collection
Private Lingvo16_LanguageNames As New Collection
Private Lingvo16_LanguageShortNames As New Collection
Private Lingvo16_WritingLog As Boolean
Private Lingvo16_LogName As String
Private Lingvo16_InterfaceLanguages As New Collection
Private Lingvo16_InterfaceLanguage As Long

'program strings
Private MSG_APPLICATION_TITLE As String
Private MSG_RUN_LINGVO_LABEL As String
Private MSG_RUN_LINGVO_SUPERTIP As String
Private MSG_HEADING_SCREENTIP As String
Private MSG_HEADING_SUPERTIP As String
Private MSG_REVERSE_SCREENTIP As String
Private MSG_REVERSE_SUPERTIP As String
Private MSG_CONTENTS_SCREENTIP As String
Private MSG_CONTENTS_SUPERTIP As String
Private MSG_COMBO_SCREENTIP As String
Private MSG_COMBO_SUPERTIP As String
Private MSG_TRANSLATE_SCREENTIP As String
Private MSG_TRANSLATE_SUPERTIP As String
Private MSG_TRANSLATE_SELECTED_LABEL As String
Private MSG_TRANSLATE_SELECTED_SUPERTIP As String
Private MSG_SETTINGS_LABEL As String
Private MSG_SETTINGS_SUPERTIP As String
Private MSG_RUN_LINGVO_FAILED As String
Private MSG_OPTIONS_MENU As String
Private MSG_OPTIONS_MENU_SHIFT_LEFT_CLICK As String
Private MSG_OPTIONS_MENU_CTRL_LEFT_CLICK As String
Private MSG_OPTIONS_MENU_ALT_LEFT_CLICK As String
Private MSG_OPTIONS_MENU_WHEEL_CLICK As String
Private MSG_OPTIONS_MENU_CTRL_ALT_LEFT_CLICK As String
Private MSG_OPTIONS_MENU_ALT_SHIFT_LEFT_CLICK As String
Private MSG_OPTIONS_MENU_CTRL_SHIFT_LEFT_CLICK As String
Private MSG_OPTIONS_MENU_CTRL_WIN_LEFT_CLICK As String
Private MSG_OPTIONS_MENU_MOUSE_OVER As String
Private MSG_OPTIONS_MENU_SHIFT_MOUSE_OVER As String
Private MSG_OPTIONS_MENU_CTRL_MOUSE_OVER As String
Private MSG_OPTIONS_MENU_ALT_MOUSE_OVER As String
Private MSG_OPTIONS_MENU_CTRL_ALT_MOUSE_OVER As String
Private MSG_OPTIONS_MENU_CTRL_SHIFT_MOUSE_OVER As String
Private MSG_OPTIONS_MENU_ALT_SHIFT_MOUSE_OVER As String
Private MSG_OPTIONS_MENU_CTRL_WIN_MOUSE_OVER As String
Private MSG_OPTIONS_MENU_CTRL_INS_INS As String
Private MSG_OPTIONS_MENU_CTRL_C_C As String
Private MSG_CONTEXT_MENU_NAME As String
Private MSG_AnotherComCallInProgress As String
Private MSG_LingvoIsBusy As String
Private MSG_LingvoIsNotReady As String
Private MSG_LingvoComError As String

'languages
Private MSG_LANG_ARABIC As String
Private MSG_LANG_AFRIKAANS As String
Private MSG_LANG_BELARUSIAN As String
Private MSG_LANG_BULGARIAN As String
Private MSG_LANG_CZECH As String
Private MSG_LANG_DANISH As String
Private MSG_LANG_GERMAN As String
Private MSG_LANG_ENGLISH As String
Private MSG_LANG_SPANISH_TRADITIONAL_SORT As String
Private MSG_LANG_SPANISH_MODERN_SORT As String
Private MSG_LANG_BASQUE As String
Private MSG_LANG_FINNISH As String
Private MSG_LANG_FRENCH As String
Private MSG_LANG_HUNGARIAN As String
Private MSG_LANG_INDONESIAN As String
Private MSG_LANG_ITALIAN As String
Private MSG_LANG_DUTCH As String
Private MSG_LANG_NORWEGIAN_BOKMAL As String
Private MSG_LANG_NORWEGIAN_NYNORSK As String
Private MSG_LANG_POLISH As String
Private MSG_LANG_PORTUGUESE As String
Private MSG_LANG_RUSSIAN As String
Private MSG_LANG_SERBIAN_CYRILLIC As String
Private MSG_LANG_SWEDISH As String
Private MSG_LANG_SWAHILI As String
Private MSG_LANG_UKRAINIAN As String
Private MSG_LANG_TURKISH As String
Private MSG_LANG_CHINESEPRC As String
Private MSG_LANG_CHINESE As String
Private MSG_LANG_LATIN As String
Private MSG_LANG_ISLANDIC As String
Private MSG_LANG_LATVIAN As String
Private MSG_LANG_LITHUANIAN As String
Private MSG_LANG_ROMANIAN As String
Private MSG_LANG_SLOVAK As String
Private MSG_LANG_SLOVENIAN As String
Private MSG_LANG_GREEK As String
Private MSG_LANG_TATAR As String
Private MSG_LANG_KAZAKH As String
Private MSG_LANG_ARMENIAN_EAST As String
Private MSG_LANG_ARMENIAN_WEST As String
Private MSG_LANG_BASHKIR As String
Private MSG_LANG_ESTONIAN As String
Private MSG_LANG_GEORGIAN As String
Private MSG_LANG_MALAY As String
Private MSG_LANG_NA As String

Private Enum LV16_InterfaceLanguages
    ilUnknown = -1
    ilEnglish = 0
    ilRussian = 1
    ilGerman = 2
    ilFrench = 3
    ilUkrainean = 4
    ilSpanish = 5
    ilPolish = 15
    ilKazakh = 42
    ilChinese = 64
End Enum

Private Const LingvoComKey = "Lingvo.Application.16"
Private Const LingvoRegistryKey = "Software\ABBYY\Lingvo\16.0"
Private Const LingvoCustomPart = "{B9918612-9F25-4E16-9C35-CB6CC6F36488}"

Private Const STANDARD_RIGHTS_EXECUTE = &H20000
Private Const FILE_READ_ATTRIBUTES = &H80
Private Const FILE_EXECUTE = &H20
Private Const SYNCHRONIZE = &H100000
Private Const FILE_GENERIC_EXECUTE = STANDARD_RIGHTS_EXECUTE Or FILE_READ_ATTRIBUTES Or FILE_EXECUTE Or SYNCHRONIZE
Private Const FILE_SHARE_READ = 1
Private Const FILE_SHARE_WRITE = 2
Private Const OPEN_EXISTING = 3
Private Const FILE_ATTRIBUTE_NORMAL = &H80
Private Const INVALID_HANDLE_VALUE = -1
Private Const ERROR_MORE_DATA = 234
Public TimerModule As New TimerClass


#If VBA7 Then
Private Declare PtrSafe Function CreateFile Lib "kernel32.dll" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, _
    ByVal dwShareMode As Long, ByVal lpSecurityAttributes As LongPtr, ByVal dwCreationDisposition As Long, _
    ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As LongPtr) As LongPtr
Private Declare PtrSafe Function CloseHandle Lib "kernel32.dll" (ByVal hObject As LongPtr) As Long
Private Declare PtrSafe Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function RegisterWindowMessage Lib "user32.dll" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long
Private Declare PtrSafe Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As Long
Private Declare PtrSafe Function IsWindow Lib "user32.dll" (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function IsIconic Lib "user32.dll" (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function IsWindowEnabled Lib "user32.dll" (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function GetLastActivePopup Lib "user32.dll" (ByVal hwndOwnder As LongPtr) As LongPtr
#Else
Private Declare Function CreateFile Lib "kernel32.dll" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function IsWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function IsIconic Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function IsWindowEnabled Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetLastActivePopup Lib "user32" (ByVal hwndOwnder As Long) As Long
#End If

Sub Lingvo16_RibbonLoaded(ribbon As IRibbonUI)
    Set Lingvo16_Ribbon = ribbon

    Lingvo16_Installed = False
    Lingvo16_LingvoRunning = False
    Lingvo16_HeadingLanguage = 0
    Lingvo16_ContentsLanguage = 0
    Lingvo16_WritingLog = False
    Lingvo16_LogName = Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\LogFile")
    If Trim(Lingvo16_LogName) <> "" Then
        Lingvo16_WritingLog = True
    End If

    'проверяем, можно ли писать в заданный файл
    If Lingvo16_WritingLog Then
        On Error GoTo Lingvo16_RibbonLoaded_error
        Open Lingvo16_LogName For Append Access Write Lock Write As #1
        Close #1
        GoTo Lingvo16_RibbonLoaded_done_check
        
Lingvo16_RibbonLoaded_error:
        Lingvo16_WritingLog = False
        
Lingvo16_RibbonLoaded_done_check:
    End If

    Call Lingvo16_writeLog("----------------------------------------------")
    Call Lingvo16_writeLog("Loading ribbon")
    
    Call Lingvo16_setInterfaceLanguage
    Call Lingvo16_fillLanguages
    Call Lingvo16_setContextMenus
    
    ' регистрируем сообщения для общения с Lingvo
    Lingvo16_ShowTranslationSettings = RegisterWindowMessage("Lv16_Lingvo_Show_Translation_Settings")
    Lingvo16_ChangeSettings = RegisterWindowMessage("Lv16_Agent_Options")

    ' проверяем наличие регистрации Lingvo в качестве COM-объекта,
    ' а также наличие исполняемого файла в соответствии с параметрами регистрации
    Dim clsid As String, lingvoFile As String
    clsid = Lingvo16_ReadRegistryKey("HKCR\" + LingvoComKey + "\CLSID\")
    Call Lingvo16_writeLog("Lingvo CLSID is: " + clsid)
    If clsid <> "" Then
#If Win64 Then
        lingvoFile = Lingvo16_ReadRegistryKey("HKCR\Wow6432Node\CLSID\" + clsid + "\LocalServer32\")
#Else
        lingvoFile = Lingvo16_ReadRegistryKey("HKCR\CLSID\" + clsid + "\LocalServer32\")
#End If
        Call Lingvo16_writeLog("Lingvo EXE is: " + lingvoFile)
        If lingvoFile <> "" Then
            If Lingvo16_exeFileExists(lingvoFile) Then
                Lingvo16_Installed = True
                Call Lingvo16_writeLog("Lingvo EXE found")
            End If
        End If
    End If
    
    ' запускаем мониторинг запуска Лингво, только если Лингво найдена
    If Lingvo16_Installed Then
        Call Document_Open
    End If

    Call Lingvo16_writeLog("Ribbon loaded")
End Sub

Private Sub Document_Open()
    Call Lingvo16_writeLog("Starting timer")
    Call TimerModule.Lingvo16_StartTimer(Me)
End Sub

Private Sub Document_Close()
    Call Lingvo16_writeLog("Stopping timer")
    Call TimerModule.Lingvo16_StopTimer
End Sub

Sub Lingvo16_DetectLingvoApplication()
    Dim found As Boolean
    
    If Lingvo16_FindMainWindow() <> 0 Then
        found = True
    Else
        found = False
    End If

    ' если Lingvo только что была запущена или остановлена, то перерисовываем ribbon
    If found <> Lingvo16_LingvoRunning Then
        Call Lingvo16_Ribbon.Invalidate
        Lingvo16_LingvoRunning = found
        If Lingvo16_LingvoRunning Then
            Call Lingvo16_writeLog("Lingvo start is detected")
        Else
            Call Lingvo16_writeLog("Lingvo stop is detected")
        End If
    End If
End Sub

Sub Lingvo16_getGroupLabel(control As IRibbonControl, ByRef label)
    label = MSG_APPLICATION_TITLE
End Sub

Sub Lingvo16_runLingvoLabel(control As IRibbonControl, ByRef label)
    label = MSG_RUN_LINGVO_LABEL
End Sub

Sub Lingvo16_runLingvoSupertip(control As IRibbonControl, ByRef supertip)
    supertip = MSG_RUN_LINGVO_SUPERTIP
End Sub

Sub Lingvo16_headingSupertip(control As IRibbonControl, ByRef supertip)
    supertip = MSG_HEADING_SUPERTIP
End Sub

Sub Lingvo16_reverseScreentip(control As IRibbonControl, ByRef screentip)
    screentip = MSG_REVERSE_SCREENTIP
End Sub

Sub Lingvo16_reverseSupertip(control As IRibbonControl, ByRef supertip)
    supertip = MSG_REVERSE_SUPERTIP
End Sub

Sub Lingvo16_contentsSupertip(control As IRibbonControl, ByRef supertip)
    supertip = MSG_CONTENTS_SUPERTIP
End Sub

Sub Lingvo16_comboScreentip(control As IRibbonControl, ByRef screentip)
    screentip = MSG_COMBO_SCREENTIP
End Sub

Sub Lingvo16_comboSupertip(control As IRibbonControl, ByRef supertip)
    supertip = MSG_COMBO_SUPERTIP
End Sub

Sub Lingvo16_translateScreentip(control As IRibbonControl, ByRef screentip)
    screentip = MSG_TRANSLATE_SCREENTIP
End Sub

Sub Lingvo16_translateSupertip(control As IRibbonControl, ByRef supertip)
    supertip = MSG_TRANSLATE_SUPERTIP
End Sub

Sub Lingvo16_translateSelectedLabel(control As IRibbonControl, ByRef label)
    label = MSG_TRANSLATE_SELECTED_LABEL
End Sub

Sub Lingvo16_translateSelectedSupertip(control As IRibbonControl, ByRef supertip)
    supertip = MSG_TRANSLATE_SELECTED_SUPERTIP
End Sub

Sub Lingvo16_settingsLabel(control As IRibbonControl, ByRef label)
    label = MSG_SETTINGS_LABEL
End Sub

Sub Lingvo16_settingsSupertip(control As IRibbonControl, ByRef supertip)
    supertip = MSG_SETTINGS_SUPERTIP
End Sub

Sub Lingvo16_TabIsAvailable(control As IRibbonControl, ByRef visible)
    ' если Lingvo не найдено, то ribbon вообще не показываем
    If Lingvo16_Installed Then
        visible = True
        Call Lingvo16_writeLog("Tab is visible")
    Else
        visible = False
        Call Lingvo16_writeLog("Tab is not visible")
    End If
End Sub

' если Lingvo не запущено, показываем панель с кнопкой "Запустить",
' все остальное скрыто
Sub Lingvo16_startBarVisible(control As IRibbonControl, ByRef visible)
    visible = Not Lingvo16_LingvoRunning
    If visible Then
        Call Lingvo16_writeLog("Start button is visible")
    End If
End Sub

' если Lingvo запущено, убираем кнопку "Запустить" и показываем все остальное
Sub Lingvo16_languageBarVisible(control As IRibbonControl, ByRef visible)
    visible = Lingvo16_LingvoRunning
    If visible Then
        Call Lingvo16_writeLog("Lingvo panel is visible")
    End If
End Sub

' запуск Lingvo
Sub Lingvo16_runLingvoAction(control As IRibbonControl)
    Call Lingvo16_writeLog("Running Lingvo")
    
    Dim Lingvo As Object
    If Not Lingvo16_runLingvo(Lingvo) Then
        Exit Sub
    End If
End Sub

' тултип
Sub Lingvo16_headingScreentip(control As IRibbonControl, ByRef tip)
    Call Lingvo16_writeLog("Getting full heading language")
    
    If Not Lingvo16_LingvoRunning Then
        label = ""
        Exit Sub
    End If
    
    ' сначала вызываем Lingvo16_getHeadingLabel, т.к. там задается язык
    Call Lingvo16_getHeadingLabel(control, tip)
    
    If Lingvo16_HeadingLanguage <> -1 Then
        Dim Lingvo As Object
        If Not Lingvo16_runLingvo(Lingvo) Then
            Exit Sub
        End If
        tip = Lingvo16_getFullLanguage(Lingvo16_HeadingLanguage)
    Else
        tip = "NA"
    End If

    Call Lingvo16_writeLog("Full heading language is: " + tip)
End Sub

' заголовок меню языков, с которых переводим (короткая строка типа 'en')
Sub Lingvo16_getHeadingLabel(control As IRibbonControl, ByRef label)
    Call Lingvo16_writeLog("Getting short heading language")
    
    If Not Lingvo16_LingvoRunning Then
        label = ""
        Exit Sub
    End If
    
    Dim langString As String
    langString = Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\HeadingLanguage")
    Call Lingvo16_writeLog("Heading language in registry: " + langString)

    Dim Lingvo As Object
    If Not Lingvo16_runLingvo(Lingvo) Then
        Exit Sub
    End If

    If langString = "" Then
        Lingvo16_HeadingLanguage = Lingvo16_getDefaultHeadingLanguage
        Call Lingvo16_writeLog("Default heading language is set: " + CStr(Lingvo16_HeadingLanguage))
    Else
        ' проверяем, присутствует ли по-прежнему нужный язык в списке
        Lingvo16_HeadingLanguage = CLng(langString)
        Dim headingLanguages
        headingLanguages = Lingvo.GetHeadingLanguages
        Dim i As Integer, found As Boolean
        found = False
        For i = LBound(headingLanguages) To UBound(headingLanguages)
            If headingLanguages(i) = Lingvo16_HeadingLanguage Then
                found = True
                Exit For
            End If
        Next i
        If found Then
            Call Lingvo16_writeLog("Heading language is found: " + CStr(Lingvo16_HeadingLanguage))
        Else
            Lingvo16_HeadingLanguage = Lingvo16_getDefaultHeadingLanguage
            Call Lingvo16_writeLog("Default heading language is set: " + CStr(Lingvo16_HeadingLanguage))
        End If
    End If
    
    Call Lingvo16_WriteRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\HeadingLanguage", CStr(Lingvo16_HeadingLanguage))
    Call Lingvo16_writeLog("Heading language saved in registry")
    
    If Lingvo16_ContentsLanguage = 0 Or Lingvo16_ContentsLanguage = -1 Then
        ' нужно гарантировать, что перед обновлением других контролов заданы оба языка
        Dim tmpLabel
        Call Lingvo16_getContentsLabel(control, tmpLabel)
    End If
    
    Call Lingvo16_Ribbon.InvalidateControl("reverseLanguages")
    Call Lingvo16_Ribbon.InvalidateControl("translate")
    Call Lingvo16_Ribbon.InvalidateControl("translateSelected")
    
    If Lingvo16_HeadingLanguage <> -1 Then
        label = Lingvo16_getShortLanguage(Lingvo16_HeadingLanguage)
    Else
        label = "NA"
    End If

    Call Lingvo16_writeLog("Short heading language is: " + label)
End Sub

' строим меню как XML-строку
Sub Lingvo16_getHeadingMenu(control As IRibbonControl, ByRef menu)
    Call Lingvo16_writeLog("Creating heading menu")
    Dim Lingvo As Object
    If Not Lingvo16_runLingvo(Lingvo) Then
        Exit Sub
    End If

    Lingvo16_HeadingMenuLanguages = Lingvo.GetHeadingLanguages
    Call Lingvo16_sortLanguages(Lingvo16_HeadingMenuLanguages)
    
    menu = "<menu xmlns=""http://schemas.microsoft.com/office/2006/01/customui"">"
    
    Dim i As Integer
    For i = LBound(Lingvo16_HeadingMenuLanguages) To UBound(Lingvo16_HeadingMenuLanguages)
        menu = menu + "<toggleButton id=""button" + CStr(i) + """ label=""" + Lingvo16_getFullLanguage(Lingvo16_HeadingMenuLanguages(i)) + """ getPressed=""Lingvo16_headingPressed"" onAction=""Lingvo16_headingAction"" />"
    Next i
    
    menu = menu + "</menu>"

    Call Lingvo16_writeLog("Heading menu is created: " + menu)
End Sub

' нужно ли ставить галку у языка в меню
Sub Lingvo16_headingPressed(control As IRibbonControl, ByRef checked)
    Dim id As Integer
    id = CInt(Right(control.id, Len(control.id) - 6))
    Call Lingvo16_writeLog("Checking heading menu item: " + CStr(id))
    If Lingvo16_HeadingMenuLanguages(id) = Lingvo16_HeadingLanguage Then
        checked = True
        Call Lingvo16_writeLog("Item is checked")
    Else
        checked = False
        Call Lingvo16_writeLog("Item is not checked")
    End If
End Sub

' выбран язык, с которого переводим
Sub Lingvo16_headingAction(control As IRibbonControl, isPressed As Boolean)
    Dim id As Integer
    id = CInt(Right(control.id, Len(control.id) - 6))
    Call Lingvo16_writeLog("Heading menu item is clicked: " + CStr(id))
    
    Dim Lingvo As Object
    If Not Lingvo16_runLingvo(Lingvo) Then
        Exit Sub
    End If
    
    ' пытаемся подобрать язык, на который переводим (т.к. в новом списке он может отсутствовать)
    Dim oldHeadingLanguage As Long, oldContentsLanguage As Long
    oldHeadingLanguage = Lingvo16_HeadingLanguage
    oldContentsLanguage = Lingvo16_ContentsLanguage
    Lingvo16_HeadingLanguage = Lingvo16_HeadingMenuLanguages(id)
    Lingvo16_ContentsLanguage = Lingvo.GetBestLanguageMatch(oldHeadingLanguage, oldContentsLanguage, Lingvo16_HeadingLanguage)
    Call Lingvo16_WriteRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\HeadingLanguage", CStr(Lingvo16_HeadingLanguage))
    Call Lingvo16_WriteRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\ContentsLanguage", CStr(Lingvo16_ContentsLanguage))
    Call Lingvo16_Ribbon.InvalidateControl("headingLanguage")
    Call Lingvo16_Ribbon.InvalidateControl("contentsLanguage")
    Call Lingvo16_Ribbon.InvalidateControl("reverseLanguages")

    Call Lingvo16_writeLog("New heading language is: " + CStr(Lingvo16_HeadingLanguage))
    Call Lingvo16_writeLog("New contents language is: " + CStr(Lingvo16_ContentsLanguage))
End Sub

' тултип
Sub Lingvo16_contentsScreentip(control As IRibbonControl, ByRef tip)
    Call Lingvo16_writeLog("Getting full contents language")

    If Not Lingvo16_LingvoRunning Then
        label = ""
        Exit Sub
    End If
    
    ' сначала вызываем Lingvo16_getHeadingLabel и Lingvo16_getContentsLabel, т.к. там задается язык
    Call Lingvo16_getHeadingLabel(control, tip)
    Call Lingvo16_getContentsLabel(control, tip)
    
    If Lingvo16_ContentsLanguage <> -1 Then
        Dim Lingvo As Object
        If Not Lingvo16_runLingvo(Lingvo) Then
            Exit Sub
        End If
        tip = Lingvo16_getFullLanguage(Lingvo16_ContentsLanguage)
    Else
        tip = "NA"
    End If

    Call Lingvo16_writeLog("Full contents language is: " + tip)
End Sub

' заголовок меню языков, на которые переводим (короткая строка типа 'en')
Sub Lingvo16_getContentsLabel(control As IRibbonControl, ByRef label)
    Call Lingvo16_writeLog("Getting short contents language")
    
    If Not Lingvo16_LingvoRunning Then
        label = ""
        Exit Sub
    End If
    
    Dim langString As String
    langString = Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\ContentsLanguage")
    Call Lingvo16_writeLog("Contents language in registry: " + langString)

    Dim Lingvo As Object
    If Not Lingvo16_runLingvo(Lingvo) Then
        Exit Sub
    End If

    If langString = "" Then
        Lingvo16_ContentsLanguage = Lingvo16_getDefaultContentsLanguage
        Call Lingvo16_writeLog("Default contents language is set: " + CStr(Lingvo16_ContentsLanguage))
    Else
        ' проверяем, присутствует ли по-прежнему нужный язык в списке
        Lingvo16_ContentsLanguage = CLng(langString)
        Dim contentLanguages
        contentLanguages = Lingvo.GetContentLanguages(Lingvo16_HeadingLanguage)
        Dim i As Integer, found As Boolean
        found = False
        For i = LBound(contentLanguages) To UBound(contentLanguages)
            If contentLanguages(i) = Lingvo16_ContentsLanguage Then
                found = True
                Exit For
            End If
        Next i
        If found Then
            Call Lingvo16_writeLog("Contents language is found: " + CStr(Lingvo16_ContentsLanguage))
        Else
            Lingvo16_ContentsLanguage = Lingvo16_getDefaultContentsLanguage
            Call Lingvo16_writeLog("Default contents language is set: " + CStr(Lingvo16_ContentsLanguage))
        End If
    End If
    
    Call Lingvo16_WriteRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\ContentsLanguage", CStr(Lingvo16_ContentsLanguage))
    Call Lingvo16_writeLog("Contents language saved in registry")
    Call Lingvo16_Ribbon.InvalidateControl("reverseLanguages")
    Call Lingvo16_Ribbon.InvalidateControl("translate")
    Call Lingvo16_Ribbon.InvalidateControl("translateSelected")
    
    If Lingvo16_ContentsLanguage <> -1 Then
        label = Lingvo16_getShortLanguage(Lingvo16_ContentsLanguage)
    Else
        label = "NA"
    End If

    Call Lingvo16_writeLog("Short contents language is: " + label)
End Sub

' строим меню как XML-строку
Sub Lingvo16_getContentsMenu(control As IRibbonControl, ByRef menu)
    Call Lingvo16_writeLog("Creating contents menu")
    
    Dim Lingvo As Object
    If Not Lingvo16_runLingvo(Lingvo) Then
        Exit Sub
    End If

    Lingvo16_ContentsMenuLanguages = Lingvo.GetContentLanguages(Lingvo16_HeadingLanguage)
    Call Lingvo16_sortLanguages(Lingvo16_ContentsMenuLanguages)
    
    menu = "<menu xmlns=""http://schemas.microsoft.com/office/2006/01/customui"">"
    
    Dim i As Integer
    For i = LBound(Lingvo16_ContentsMenuLanguages) To UBound(Lingvo16_ContentsMenuLanguages)
        menu = menu + "<toggleButton id=""button" + CStr(i) + """ label=""" + Lingvo16_getFullLanguage(Lingvo16_ContentsMenuLanguages(i)) + """ getPressed=""Lingvo16_contentsPressed"" onAction=""Lingvo16_contentsAction"" />"
    Next i
    
    menu = menu + "</menu>"

    Call Lingvo16_writeLog("Contents menu is created: " + menu)
End Sub

' нужно ли ставить галку у языка в меню
Sub Lingvo16_contentsPressed(control As IRibbonControl, ByRef checked)
    Dim id As Integer
    id = CInt(Right(control.id, Len(control.id) - 6))
    Call Lingvo16_writeLog("Checking contents menu item: " + CStr(id))
    If Lingvo16_ContentsMenuLanguages(id) = Lingvo16_ContentsLanguage Then
        checked = True
        Call Lingvo16_writeLog("Item is checked")
    Else
        checked = False
        Call Lingvo16_writeLog("Item is not checked")
    End If
End Sub

' выбран язык, на который переводим
Sub Lingvo16_contentsAction(control As IRibbonControl, isPressed As Boolean)
    Dim id As Integer
    id = CInt(Right(control.id, Len(control.id) - 6))
    Call Lingvo16_writeLog("Contents menu item is clicked: " + CStr(id))
    Lingvo16_ContentsLanguage = Lingvo16_ContentsMenuLanguages(id)
    Call Lingvo16_WriteRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\ContentsLanguage", CStr(Lingvo16_ContentsLanguage))
    Call Lingvo16_Ribbon.InvalidateControl("contentsLanguage")
    Call Lingvo16_Ribbon.InvalidateControl("reverseLanguages")

    Call Lingvo16_writeLog("New contents language is: " + CStr(Lingvo16_ContentsLanguage))
End Sub

Sub Lingvo16_reverseEnabled(control As IRibbonControl, ByRef enabled)
    Call Lingvo16_writeLog("Checking reverse button")
    
    If Lingvo16_FindMainWindow() = 0 Then
        enabled = False
        Call Lingvo16_writeLog("Reverse button is not enabled")
        Exit Sub
    End If

    If Lingvo16_HeadingLanguage = -1 Or Lingvo16_ContentsLanguage = -1 Then
        enabled = False
        Call Lingvo16_writeLog("Reverse button is not enabled")
        Exit Sub
    End If

    If Lingvo16_HeadingLanguage = Lingvo16_ContentsLanguage Then
        enabled = False
        Call Lingvo16_writeLog("Reverse button is not enabled")
        Exit Sub
    End If

    Dim Lingvo As Object
    If Not Lingvo16_runLingvo(Lingvo) Then
        enabled = False
        Call Lingvo16_writeLog("Reverse button is not enabled")
        Exit Sub
    End If
    
    enabled = Lingvo.IsLanguagePairEnabled(Lingvo16_ContentsLanguage, Lingvo16_HeadingLanguage)

    If enabled Then
        Call Lingvo16_writeLog("Reverse button is enabled")
    Else
        Call Lingvo16_writeLog("Reverse button is not enabled")
    End If
End Sub

' меняем языки местами
Sub Lingvo16_reverseAction(control As IRibbonControl)
    Call Lingvo16_writeLog("Reverse button is clicked")
    
    If Lingvo16_HeadingLanguage = -1 Or Lingvo16_ContentsLanguage = -1 Then
        Exit Sub
    End If
    
    Dim Lingvo As Object
    If Not Lingvo16_runLingvo(Lingvo) Then
        Exit Sub
    End If
    
    If Not Lingvo.IsLanguagePairEnabled(Lingvo16_ContentsLanguage, Lingvo16_HeadingLanguage) Then
        Exit Sub
    End If
    
    Dim tmp As Long
    tmp = Lingvo16_HeadingLanguage
    Lingvo16_HeadingLanguage = Lingvo16_ContentsLanguage
    Lingvo16_ContentsLanguage = tmp
    Call Lingvo16_WriteRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\HeadingLanguage", CStr(Lingvo16_HeadingLanguage))
    Call Lingvo16_WriteRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\ContentsLanguage", CStr(Lingvo16_ContentsLanguage))
    Call Lingvo16_Ribbon.InvalidateControl("headingLanguage")
    Call Lingvo16_Ribbon.InvalidateControl("contentsLanguage")

    Call Lingvo16_writeLog("New heading language is: " + CStr(Lingvo16_HeadingLanguage))
    Call Lingvo16_writeLog("New contents language is: " + CStr(Lingvo16_ContentsLanguage))
End Sub

' количество слов в истории переводов
Sub Lingvo16_getComboItemCount(control As IRibbonControl, ByRef count)
    Call Lingvo16_writeLog("Getting item count in combo-box")

    Dim itemString As String
    itemString = Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\WordCount")
    If itemString <> "" Then
        count = CInt(itemString)
    Else
        count = 0
    End If

    Call Lingvo16_writeLog("Items in combo-box: " + CStr(count))
End Sub

' элементы истории переводов
Sub Lingvo16_getComboItemLabel(control As IRibbonControl, index As Integer, ByRef item)
    Call Lingvo16_writeLog("Getting item in combo-box: " + CStr(index))
    
    Dim wordNo As String
    wordNo = "Word" + CStr(index)
    item = Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\" + wordNo)

    Call Lingvo16_writeLog("Item is: " + item)
End Sub

' ввели новое слово для перевода
Sub Lingvo16_getComboChanged(control As IRibbonControl, text As String)
    Lingvo16_ComboBoxValue = Trim(text)

    Call Lingvo16_writeLog("Item entered in combo-box: " + Lingvo16_ComboBoxValue)
End Sub

' можно ли переводить
Sub Lingvo16_translateEnabled(control As IRibbonControl, ByRef enabled)
    Call Lingvo16_writeLog("Checking Translate button")
    
    If Lingvo16_HeadingLanguage = -1 Or Lingvo16_ContentsLanguage = -1 Then
        enabled = False
        Call Lingvo16_writeLog("Button is not enabled")
    Else
        enabled = True
        Call Lingvo16_writeLog("Button is enabled")
    End If
End Sub

' переводим слово из комбо-бокса
Sub Lingvo16_translateAction(control As IRibbonControl)
    Call Lingvo16_writeLog("Translate button is clicked")
    
    ' в Lingvo нет доступных языков, перевод невозможен
    If Lingvo16_HeadingLanguage = -1 Or Lingvo16_ContentsLanguage = -1 Then
        Exit Sub
    End If
    
    ' вызываем на случай, если пользователь не нажал Enter,
    ' т.е. слово не считается еще введенным в комбо-бокс
    Call Lingvo16_Ribbon.InvalidateControl("translationBox")
    
    If Lingvo16_ComboBoxValue = "" Then
        Exit Sub
    End If
    
    Call Lingvo16_addWordToHistory(Lingvo16_ComboBoxValue)
    
    Call Lingvo16_Ribbon.InvalidateControl("translationBox")
    
    Dim Lingvo As Object
    If Not Lingvo16_runLingvo(Lingvo) Then
        Exit Sub
    End If
    
    If Lingvo16_FindAppWindow() <> 0 Then
        Call Lingvo16_PopupWindow
        On Error GoTo lingvoComError
        Call Lingvo.TranslateTextInDirection(Lingvo16_ComboBoxValue, Lingvo16_HeadingLanguage, Lingvo16_ContentsLanguage)
        On Error GoTo 0
    End If

    Call Lingvo16_writeLog("Translated in Lingvo: " + Lingvo16_ComboBoxValue)
    Exit Sub

lingvoComError:
    Call Lingvo16_processError("Lingvo16_translateAction", Err.Number, Err.Description)
End Sub

' можно ли переводить
Sub Lingvo16_translateSelectedEnabled(control As IRibbonControl, ByRef enabled)
    Call Lingvo16_writeLog("Checking Translate Selected button")
    
    If Lingvo16_HeadingLanguage = -1 Or Lingvo16_ContentsLanguage = -1 Then
        enabled = False
        Call Lingvo16_writeLog("Button is not enabled")
    Else
        enabled = True
        Call Lingvo16_writeLog("Button is enabled")
    End If
End Sub

Sub Lingvo16_TranslateContextMenu()
    Call Lingvo16_writeLog("Translating from context menu")
    
    Dim word As String
    word = Lingvo16_GetSelectedText()
    If word = "" Then
        Exit Sub
    End If
    
    Call Lingvo16_addWordToHistory(word)

    Dim Lingvo As Object
    If Not Lingvo16_runLingvo(Lingvo) Then
        Exit Sub
    End If

    If Lingvo16_FindAppWindow() <> 0 Then
        Call Lingvo16_PopupWindow
        On Error GoTo lingvoComError
        If Lingvo16_LingvoRunning And Lingvo16_HeadingLanguage > 0 And Lingvo16_ContentsLanguage > 0 Then
            Call Lingvo.TranslateTextInDirection(word, Lingvo16_HeadingLanguage, Lingvo16_ContentsLanguage)
        Else
            Call Lingvo.TranslateText(word)
        End If
        On Error GoTo 0
    End If

    Call Lingvo16_writeLog("Translated in Lingvo: " + word)
    Exit Sub

lingvoComError:
    Call Lingvo16_processError("Lingvo16_TranslateContextMenu", Err.Number, Err.Description)
End Sub

' переводим выделенное слово
Sub Lingvo16_translateSelectedAction(control As IRibbonControl)
    Call Lingvo16_writeLog("Translate Selected button is clicked")
    Lingvo16_TranslateContextMenu
End Sub

' строим меню настроек как XML-строку
Sub Lingvo16_getSettingsMenu(control As IRibbonControl, ByRef menu)
    Dim hoverLabel As String, clickLabel As String
    hoverLabel = Lingvo16_getHoverLabel()
    clickLabel = Lingvo16_getClickLabel()

    menu = "<menu xmlns=""http://schemas.microsoft.com/office/2006/01/customui"">"
    menu = menu + "<toggleButton id=""button1"" label=""" + hoverLabel + """ getEnabled=""Lingvo16_settingsEnabled"" getPressed=""Lingvo16_settingsPressed"" onAction=""Lingvo16_settingsAction"" />"
    menu = menu + "<toggleButton id=""button2"" label=""" + clickLabel + """ getEnabled=""Lingvo16_settingsEnabled"" getPressed=""Lingvo16_settingsPressed"" onAction=""Lingvo16_settingsAction"" />"
    menu = menu + "<toggleButton id=""button3"" label=""" + MSG_OPTIONS_MENU_CTRL_INS_INS + """ getEnabled=""Lingvo16_settingsEnabled"" getPressed=""Lingvo16_settingsPressed"" onAction=""Lingvo16_settingsAction"" />"
    menu = menu + "<toggleButton id=""button4"" label=""" + MSG_OPTIONS_MENU_CTRL_C_C + """ getEnabled=""Lingvo16_settingsEnabled"" getPressed=""Lingvo16_settingsPressed"" onAction=""Lingvo16_settingsAction"" />"
    menu = menu + "<menuSeparator id=""sep1"" />"
    menu = menu + "<button id=""button5"" label=""" + MSG_OPTIONS_MENU + """ getEnabled=""Lingvo16_settingsEnabled"" onAction=""Lingvo16_optionsAction"" />"
    menu = menu + "</menu>"
End Sub

Function Lingvo16_getHoverLabel() As String
    Dim hoverTypeString As String, hoverKey As String
    hoverTypeString = Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Launcher\useMouseCoverType")
    If hoverTypeString = "coverOnly" Then
        Lingvo16_getHoverLabel = MSG_OPTIONS_MENU_MOUSE_OVER
    ElseIf hoverTypeString = "coverPlusClick" Then
        hoverKey = Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Launcher\useMouseCoverVirtualKey")
        Select Case hoverKey
            Case "ctrl"
                Lingvo16_getHoverLabel = MSG_OPTIONS_MENU_CTRL_MOUSE_OVER
            Case "shift"
                Lingvo16_getHoverLabel = MSG_OPTIONS_MENU_SHIFT_MOUSE_OVER
            Case "alt"
                Lingvo16_getHoverLabel = MSG_OPTIONS_MENU_ALT_MOUSE_OVER
            Case "ctrl-alt"
                Lingvo16_getHoverLabel = MSG_OPTIONS_MENU_CTRL_ALT_MOUSE_OVER
            Case "ctrl-shift"
                Lingvo16_getHoverLabel = MSG_OPTIONS_MENU_CTRL_SHIFT_MOUSE_OVER
            Case "alt-shift"
                Lingvo16_getHoverLabel = MSG_OPTIONS_MENU_ALT_SHIFT_MOUSE_OVER
            Case "ctrl-win"
                Lingvo16_getHoverLabel = MSG_OPTIONS_MENU_CTRL_WIN_MOUSE_OVER
            Case Else
                Lingvo16_getHoverLabel = MSG_OPTIONS_MENU_CTRL_MOUSE_OVER
        End Select
    Else
        Lingvo16_getHoverLabel = MSG_OPTIONS_MENU_MOUSE_OVER
    End If
End Function

Function Lingvo16_getClickLabel() As String
    Dim clickType As String
    clickType = Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Launcher\useMouseClickType")
    Select Case clickType
        Case "leftKeyPlusMenu"
            Lingvo16_getClickLabel = MSG_OPTIONS_MENU_ALT_LEFT_CLICK
        Case "leftKeyPlusCtrl"
            Lingvo16_getClickLabel = MSG_OPTIONS_MENU_CTRL_LEFT_CLICK
        Case "leftKeyPlusShift"
            Lingvo16_getClickLabel = MSG_OPTIONS_MENU_SHIFT_LEFT_CLICK
        Case "middleKey"
            Lingvo16_getClickLabel = MSG_OPTIONS_MENU_WHEEL_CLICK
        Case "leftKeyPlusCtrlAlt"
            Lingvo16_getClickLabel = MSG_OPTIONS_MENU_CTRL_ALT_LEFT_CLICK
        Case "leftKeyPlusAltShift"
            Lingvo16_getClickLabel = MSG_OPTIONS_MENU_ALT_SHIFT_LEFT_CLICK
        Case "leftKeyPlusCtrlShift"
            Lingvo16_getClickLabel = MSG_OPTIONS_MENU_CTRL_SHIFT_LEFT_CLICK
        Case "leftKeyPlusCtrlWin"
            Lingvo16_getClickLabel = MSG_OPTIONS_MENU_CTRL_WIN_LEFT_CLICK
        Case Else
            Lingvo16_getClickLabel = MSG_OPTIONS_MENU_ALT_LEFT_CLICK
    End Select
End Function

' доступность настроек
Sub Lingvo16_settingsEnabled(control As IRibbonControl, ByRef enabled)
    Call Lingvo16_writeLog("Checking Settings menu item: " + control.id)
    
    If control.id = "button1" Or control.id = "button5" Then
        enabled = True
        If Lingvo16_FindMainWindow() = 0 Then
            enabled = False
        End If
    ElseIf control.id = "button2" Or control.id = "button3" Or control.id = "button4" Then
        enabled = True
    End If
    
    If enabled Then
        Call Lingvo16_writeLog("Item is enabled")
    Else
        Call Lingvo16_writeLog("Item is not enabled")
    End If
End Sub

' расстановка галок в меню настроек
Sub Lingvo16_settingsPressed(control As IRibbonControl, ByRef checked)
    Call Lingvo16_writeLog("Checking Settings menu item: " + control.id)
    
    If control.id = "button1" Then
        checked = True
        If Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Launcher\useMouseCover") = "false" Then
            checked = False
        End If
    ElseIf control.id = "button2" Then
        checked = True
        If Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Launcher\useMouseClick") = "false" Then
            checked = False
        End If
    ElseIf control.id = "button3" Then
        checked = True
        If Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Launcher\useCtrlInsIns") = "false" Then
            checked = False
        End If
    ElseIf control.id = "button4" Then
        checked = True
        If Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Launcher\useCtrlCC") = "false" Then
            checked = False
        End If
    End If

    If checked Then
        Call Lingvo16_writeLog("Item is checked")
    Else
        Call Lingvo16_writeLog("Item is not checked")
    End If
End Sub

' изменение настроек
Sub Lingvo16_settingsAction(control As IRibbonControl, isPressed As Boolean)
    Call Lingvo16_writeLog("Settings menu item is clicked: " + control.id)
    
    Dim value As String
    
    If isPressed Then
        value = "true"
    Else
        value = "false"
    End If
    
    If control.id = "button1" Then
        Call Lingvo16_WriteRegistryKey("HKCU\" + LingvoRegistryKey + "\Launcher\useMouseCover", value)
…
vbaProject_00.bin vba-project OOXML VBA project: word/vbaProject.bin 199168 bytes
SHA-256: d1ba57cbfa8139dace4670f2f03dc6f4ceb48ee9e7b7b82a6310bbfee1998001