Что нового

[Баг] Не работает скрипт с UDF функцией _GuiCtrlHotKey_Create

Egorkaru

Новичок
Сообщения
20
Репутация
1
Здравствуйте, уважаемые форумчане, помогите, пожалуйста! Я хотел выполнить скрипт, указанный ниже (взят из русской справки AutoIt):
Код:
; rasim
; http://www.autoitscript.com/forum/index.php?showtopic=83224&st=0&p=595204&#entry595204
; Пример установки 8 горячих клавиш, используя массивы

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <GuiHotKey.au3>

Global $HotkeyID[9] = [8, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008], $HotkeyCode[9], $iCount

Switch @OSArch
    Case 'X64'
        $HKCU = 'HKCU64'
        $HKCR = 'HKCR64'
    Case Else;'X86'
        $HKCU = 'HKCU'
        $HKCR = 'HKCR'
EndSwitch

$hGui = GUICreate('My Program', 400, 200)
$iButton = GUICtrlCreateButton('Установка горячих клавиш', 100, 10, 200, 28)
$iBtnClear = GUICtrlCreateButton('Очистить сохранение Hotkey в реестре', 90, 80, 220, 28)
GUISetState()

; Установка сохранённых горячих клавиш при старте программы
For $i = 1 To 8
    $HotkeyCode[$i] = RegRead($HKCU & '\Software\MySoft', 'Hotkey' & $i)
    If Not @error And $HotkeyCode[$i] <> '0' Then
        $HotkeyCode[$i] = Number($HotkeyCode[$i])
        If Not _GuiCtrlHotKey_RegisterHotkey($hGui, $HotkeyID[$i], _WinAPI_LoWord($HotkeyCode[$i]), _WinAPI_HiWord($HotkeyCode[$i])) Then
            MsgBox(0, 'Сообщение', 'Не удалось зарегистрировать горячую клавишу ' & _GetKey($HotkeyCode[$i]) & ',' & @LF & _
                    'возможно она используется другим приложением.', 0, $hGui)
            $HotkeyCode[$i] = 0
        EndIf
    Else
        $HotkeyCode[$i] = 0
    EndIf
Next

; Регистрация функции обработки горячих клавиш
GUIRegisterMsg($WM_HOTKEY, "WM_HOTKEY")

While 1
    Switch GUIGetMsg()
        Case $iButton
            _Setting()
        Case $iBtnClear
            RegDelete($HKCU & '\Software\MySoft')
        Case -3
            Exit
    EndSwitch
WEnd

Func WM_HOTKEY($hWnd, $Msg, $wParam, $lParam)
    $iCount += 1
    ; Действие при вызове горячей клавиши, взависимости от идентификатора
    Switch BitAND($wParam, 0xFFFF)
        Case $HotkeyID[1]
            WinSetTitle($hGui, '', $iCount & ' раз, Hotkey= ' & _GetKey($HotkeyCode[1]))
        Case $HotkeyID[2]
            WinSetTitle($hGui, '', $iCount & ' раз, Hotkey= ' & _GetKey($HotkeyCode[2]))
        Case $HotkeyID[3]
            WinSetTitle($hGui, '', $iCount & ' раз, Hotkey= ' & _GetKey($HotkeyCode[3]))
        Case $HotkeyID[4]
            WinSetTitle($hGui, '', $iCount & ' раз, Hotkey= ' & _GetKey($HotkeyCode[4]))
        Case $HotkeyID[5]
            WinSetTitle($hGui, '', $iCount & ' раз, Hotkey= ' & _GetKey($HotkeyCode[5]))
        Case $HotkeyID[6]
            WinSetTitle($hGui, '', $iCount & ' раз, Hotkey= ' & _GetKey($HotkeyCode[6]))
        Case $HotkeyID[7]
            WinSetTitle($hGui, '', $iCount & ' раз, Hotkey= ' & _GetKey($HotkeyCode[7]))
        Case $HotkeyID[8]
            WinSetTitle($hGui, '', $iCount & ' раз, Hotkey= ' & _GetKey($HotkeyCode[8]))
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc

Func _Setting() ; окно установки горячих клавиш
    Local $aHotkey, $hGui1, $hHotkey, $iBtnOK, $tmp
    Local $f1 = 25, $HotkeyInput[9] = [8]
    $hGui1 = GUICreate('Установка горячих клавиш', 260, 280, -1, -1, BitOR($WS_CAPTION, $WS_SYSMENU, $WS_POPUP), -1, $hGui)

    For $i = 1 To 8
        GUICtrlCreateLabel('Горячая клавиша: ' & $i, 150, $f1 * $i, 290, 17)
        ; Создание поля ввода для горячих клавиш
        $HotkeyInput[$i] = _GuiCtrlHotKey_Create($hGui1, 10, $f1 * $i - 2, 130, 20)
        ; установка значений по умолчанию в поле ввода
        _GuiCtrlHotKey_SetHotkey($HotkeyInput[$i], _WinAPI_LoWord($HotkeyCode[$i]), _WinAPI_HiWord($HotkeyCode[$i]))
    Next

    $iBtnOK = GUICtrlCreateButton('OK', 90, 240, 80, 26)
    GUISetState()
    While 1
        Switch GUIGetMsg()
            Case $iBtnOK ; регистрация горячих клавиш при нажатии кнопки OK
                For $i = 1 To 8
                    $aHotkey = _GuiCtrlHotKey_GetHotkey($HotkeyInput[$i]) ; получить горячую клавишу из поля ввода
                    If IsArray($aHotkey) Then
                        $tmp = _WinAPI_MakeLong($aHotkey[0], $aHotkey[1])
                        If $HotkeyCode[$i] <> $tmp Then ; если горячая клавиша изменилась, то регистрируем её
                            ; Если регистрация прошла успешно, то
                            If _GuiCtrlHotKey_RegisterHotkey($hGui, $HotkeyID[$i], $aHotkey[0], $aHotkey[1]) Then
                                $HotkeyCode[$i] = $tmp ; обновляем код клавиши
                                ; И сохраняем в реестре
                                RegWrite($HKCU & '\Software\MySoft', 'Hotkey' & $i, 'REG_SZ', $HotkeyCode[$i])
                            Else
                                MsgBox(0, 'Сообщение', 'Не удалось зарегистрировать горячую клавишу' & _GetKey($tmp) & ',' & @LF & _
                                        'возможно она используется другим приложением.', 0, $hGui1)
                                $HotkeyCode[$i] = 0
                            EndIf
                        EndIf
                    Else ; если горячая клавиша сброшена/отменена, то разрегистрируем горячую клавишу
                        _GuiCtrlHotKey_UnregisterHotkey($hGui, $HotkeyID[$i])
                        RegWrite($HKCU & '\Software\MySoft', 'Hotkey' & $i, 'REG_SZ', '0')
                        $HotkeyCode[$i] = 0
                    EndIf
                Next

                ContinueCase
            Case -3
                For $i = 1 To 8
                    ; Удаление объектов полей ввода
                    _WinAPI_DestroyWindow($HotkeyInput[$i])
                Next
                GUISetState(@SW_ENABLE, $hGui)
                GUIDelete($hGui1)
                ExitLoop
        EndSwitch
    WEnd
EndFunc

; Получает текстовое значение горячей клавиши из кода
Func _GetKey($HotkeyCode)
    Local $HiW, $Key
    $HiW = _WinAPI_HiWord($HotkeyCode)
    
    If BitAND($HiW, $HOTKEYF_CONTROL) Then $Key &= ' + Ctrl'
    If BitAND($HiW, $HOTKEYF_SHIFT) Then $Key &= ' + Shift'
    If BitAND($HiW, $HOTKEYF_ALT) Then $Key &= ' + Alt'
    
    $Key &= ' + ' & Chr(_WinAPI_LoWord($HotkeyCode))
    $Key = StringTrimLeft($Key, 3)
    
    Return $Key
EndFunc

но на экране высвечивается ошибка, указанная ниже:
da10e8e86a6a.png

Как решить эту проблему?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
965
Egorkaru
Константа $WM_HOTKEY объявлена в файле APIConstants.au3:427
Код:
Global Const $WM_HOTKEY = 0x0312

который (файл) в свою очередь объявляется в начале UDF WinAPI.au3:10
Код:
#include "WinAPIConstants.au3"

Поэтому Autoit выдаёт ошибку redeclare.
Закомментируйте константу $WM_HOTKEY в файле GuiHotKey.au3, или поищите обновлённую UDF.
 
Автор
Egorkaru

Egorkaru

Новичок
Сообщения
20
Репутация
1
Garrett сказал(а):
Egorkaru
Константа $WM_HOTKEY объявлена в файле APIConstants.au3:427
Код:
Global Const $WM_HOTKEY = 0x0312

который (файл) в свою очередь объявляется в начале UDF WinAPI.au3:10
Код:
#include "WinAPIConstants.au3"

Поэтому Autoit выдаёт ошибку redeclare.
Закомментируйте константу $WM_HOTKEY в файле GuiHotKey.au3, или поищите обновлённую UDF.
Спасибо, помогло. Можно закрыть тему.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,321
Egorkaru [?]
Можно закрыть тему.
[info border=#0000ff float=left]На форуме принято помечать тему решенной после получения ответа на свой вопрос!
Вверху или внизу темы нажмите на ссылку такого вида:
package_old.gif
Тема не решена
[/info]
 
Верх