Что нового

Разрешить HotKeySet

eus_deus

Новичок
Сообщения
118
Репутация
0
Здравствуйте.
Объясните, пожалуйста, как можно ограничить HotKeySet только определенным окном?
Вот пример:
Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
Func _frm_single()
    $frm_1 = GUICreate("Форма", 400, 344, -1, -1, $WS_OVERLAPPEDWINDOW)
    GUISetState(@SW_SHOW)
    _set_shortcuts()
    While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                Exit
        EndSwitch
    WEnd
EndFunc

Func _set_shortcuts()
    HotKeySet("{ESC}", "Terminate")
EndFunc

Func Terminate()
    Exit 0
EndFunc

_frm_single()

При данной реализации клавиши работают везде, будь окно активно или свернуто. И в других программах не работают.. Как можно это поправить?
 

Oki

Продвинутый
Сообщения
452
Репутация
62
При данной реализации клавиши работают везде, будь окно активно или свернуто. И в других программах не работают.. Как можно это поправить?
Горячие клавиши будут вызываться везде, но выполнять возложенную на них функциональность только в нужной ситуации, если в начале отработки вызванной горячей клавишей функции сразу ставить условный оператор проверки актуальности требуемого условия.
 

All2khoff

Продвинутый
Сообщения
351
Репутация
65
Горячие клавиши будут вызываться везде, но выполнять возложенную на них функциональность только в нужной ситуации, если в начале отработки вызванной горячей клавишей функции сразу ставить условный оператор проверки актуальности требуемого условия.
Сложно написал) если упростить, то проще всего в операцию вызванную хоткеем поставить условие
Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
Func _frm_single()
    $frm_1 = GUICreate("Форма", 400, 344, -1, -1, $WS_OVERLAPPEDWINDOW)
    GUISetState(@SW_SHOW)
    _set_shortcuts()
    While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                Exit
        EndSwitch
    WEnd
EndFunc

Func _set_shortcuts()
    HotKeySet("{ESC}", "Terminate")
EndFunc

Func Terminate()
    If WinActive ("Форма") Then
        ;"То что хочеш выполнить"
        Exit 0
    Else
        ;"Условие не выполнено, ничего не делаем"
    EndIf
EndFunc

_frm_single()

Предположим хочется чтобы по ESC окно "Форма" закрывалось только когда оно активно.
 
Автор
E

eus_deus

Новичок
Сообщения
118
Репутация
0
Сложно написал) если упростить, то проще всего в операцию вызванную хоткеем поставить условие
Это я проверял... Но - кнопки не работают в других приложениях. Да, они не отрабатывают, если окно не активно, но они и не работают нигде, пока программа запущена
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Код:
GUISetAccelerators() ; клавиши работают только в активном окне собственного GUI

А зачем назначать ESC? Она и так закрывает GUI. Если только для закрытия неактивного окна...
 
Автор
E

eus_deus

Новичок
Сообщения
118
Репутация
0
Хороший вариант бы был. Только элементов управления нет - есть функции. Ладно, нельзя так нельзя. Просто буду знать, что при открытом окне нечего щелкать по другим окнам
Нашел.
Код:
_HotKey_Assign($VK_ESCAPE, 'Terminate', 0, $Form1)

Через стороннюю UDF
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
проще кнопок навесить на форму
Во-первых, как я уже написал, вместо кнопок можно навесить dummy.
Во-вторых, даже в справке описано, как "пропускать" горячие клавиши в текущее активное окно
Код:
; capture and pass along a keypress
HotKeySet("{Esc}", "captureEsc")
Func captureEsc()
    ; ... can do stuff here
    HotKeySet("{Esc}")
    Send("{Esc}")
    HotKeySet("{Esc}", "captureEsc")
EndFunc

Но если горячих клавиш несколько, то можно сделать такой костыль
Код:
#include <GUIConstants.au3>

Global $frm_1

Func _frm_single()
    $frm_1 = GUICreate("Форма", 400, 344, -1, -1, $WS_OVERLAPPEDWINDOW)
    GUISetState(@SW_SHOW)
    _set_shortcuts()
    While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                Exit
        EndSwitch
    WEnd
EndFunc

Func _set_shortcuts()
  HotKeySet("^n", "_translate_shortcuts") ; новый файл в SciTE
  HotKeySet("^+s", "_translate_shortcuts") ; сохранить как в SciTE
EndFunc

Func _translate_shortcuts()
  If WinActive($frm_1) Then
    Switch @HotKeyPressed
      Case "^n"
        MsgBox(0, "", "^n")
      Case "^+s"
        MsgBox(0, "", "^+s")
    EndSwitch
  Else
    HotKeySet(@HotKeyPressed)
    Send(@HotKeyPressed)
    HotKeySet(@HotKeyPressed, "_translate_shortcuts")
  EndIf
EndFunc

_frm_single()
 
Автор
E

eus_deus

Новичок
Сообщения
118
Репутация
0
Но если горячих клавиш несколько, то можно сделать такой костыль
Разумеется, их несколько. С учетом дублирующих (для раскладки разной) сейчас их 16
Вот пробовал писать с костылем, но то ли лыжи не едут, то ли я....
Некоторые сочетания работают, некоторые нет - просто нет реакции и противный звук ошибки
Код:
Func _set_shortcuts()
    HotKeySet("{ESC}", "_translate_shortcuts")
    HotKeySet("{F1}", "_translate_shortcuts")
    HotKeySet("{F2}", "_translate_shortcuts")
    HotKeySet("{F3}", "_translate_shortcuts")
    HotKeySet("{F4}", "_translate_shortcuts")
    HotKeySet("{!a}", "_translate_shortcuts")
    HotKeySet("{!ф}", "_translate_shortcuts")
    HotKeySet("{DELETE}", "_translate_shortcuts")
    HotKeySet("!w", "_translate_shortcuts")
    HotKeySet("!ц", "_translate_shortcuts")
    HotKeySet("!q", "_translate_shortcuts")
    HotKeySet("!й", "_translate_shortcuts")
    HotKeySet("{^a}", "_translate_shortcuts")
    HotKeySet("{^ф}", "_translate_shortcuts")
    HotKeySet("{^z}", "_translate_shortcuts")
    HotKeySet("{^я}", "_translate_shortcuts")
EndFunc

Func _translate_shortcuts()
    If WinActive($frm_book_mark) Then
        Switch @HotKeyPressed
            Case "{ESC}"
                Terminate()
            Case "{F1}"
                Help()
            Case "{F2}"
                _update_list()
            Case "{F3}"
                SetFocusSearch()
            Case "{F4}"
                _mark_read()
            Case "!a"
                _add_to_worklist()
            Case "{DELETE}"
                _del_from_worklist()
            Case "!w" To "!ц"
                _show_worklist()
            Case "!q" To "!й"
                _alllist()
            Case "^a" To "^ф"
                _selection($hLview2, "select all")
            Case "^z" To "^я"
                _selection($hLview2, "deselect all")
        EndSwitch
    Else
        HotKeySet(@HotKeyPressed)
        Send(@HotKeyPressed)
        HotKeySet(@HotKeyPressed, "_translate_shortcuts")
    EndIf
EndFunc
 
Последнее редактирование:

Andrey_A

Продвинутый
Сообщения
323
Репутация
68
Может в начале скрипта принудительно ставить английскую раскладку и тогда не надо будет "!й"
Код:
Func _Set_Keyboard_Eng_Script_Au3($R=DllCall('user32.dll','long','LoadKeyboardLayoutW','wstr',409,'int',0))
  If 0=@error And $R[0]Then DllCall('user32.dll','ptr','SendMessage','hwnd',WinGetHandle(AutoItWinGetTitle()),'int',80,'int',1,'int',$R[0])
EndFunc
 
Автор
E

eus_deus

Новичок
Сообщения
118
Репутация
0
Может в начале скрипта принудительно ставить английскую раскладку
Не пройдет - в скрипте нужна русская, английская, может и еще какая - пока не попадалось, но вполне возможно
Синтаксис HotKeySet() аналогичен Send()
Ну я оказался прав - лыжи едут, а вот я...
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
В вашем случае конструкция Case "^a" To "^ф" будет работать непонятно как. Потому что это все значения от строки "^a" до строки "^ф". То есть вообще непонятно что. Лучше так
Код:
Case "^a", "^ф"

Вот полный код с вашими клавишами и функциями. При запуске с английской раскладкой всё работает, как надо.
Код:
#include <GUIConstants.au3>

Global $frm_book_mark

_frm_single()

Func _frm_single()
    $frm_book_mark = GUICreate("Форма", 400, 344, -1, -1, $WS_OVERLAPPEDWINDOW)
    GUISetState(@SW_SHOW)
    _set_shortcuts()
    While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                Exit
        EndSwitch
    WEnd
EndFunc

Func _set_shortcuts()
    HotKeySet("{ESC}", "_translate_shortcuts")
    HotKeySet("{F1}", "_translate_shortcuts")
    HotKeySet("{F2}", "_translate_shortcuts")
    HotKeySet("{F3}", "_translate_shortcuts")
    HotKeySet("{F4}", "_translate_shortcuts")
    HotKeySet("!a", "_translate_shortcuts")
    HotKeySet("!ф", "_translate_shortcuts")
    HotKeySet("{DELETE}", "_translate_shortcuts")
    HotKeySet("!w", "_translate_shortcuts")
    HotKeySet("!ц", "_translate_shortcuts")
    HotKeySet("!q", "_translate_shortcuts")
    HotKeySet("!й", "_translate_shortcuts")
    HotKeySet("^a", "_translate_shortcuts")
    HotKeySet("^ф", "_translate_shortcuts")
    HotKeySet("^z", "_translate_shortcuts")
    HotKeySet("^я", "_translate_shortcuts")
EndFunc

Func _translate_shortcuts()
    If WinActive($frm_book_mark) Then
        Switch @HotKeyPressed
            Case "{ESC}"
                Terminate()
            Case "{F1}"
                Help()
            Case "{F2}"
                _update_list()
            Case "{F3}"
                SetFocusSearch()
            Case "{F4}"
                _mark_read()
            Case "!a"
                _add_to_worklist()
            Case "{DELETE}"
                _del_from_worklist()
            Case "!w", "!ц"
                _show_worklist()
            Case "!q", "!й"
                _alllist()
            Case "^a", "^ф"
                _selection("$hLview2", "select all")
            Case "^z", "^я"
                _selection("$hLview2", "deselect all")
        EndSwitch
    Else
        HotKeySet(@HotKeyPressed)
        Send(@HotKeyPressed)
        HotKeySet(@HotKeyPressed, "_translate_shortcuts")
    EndIf
EndFunc

Func Terminate()
  ConsoleWrite("Terminate" & @CRLF)
EndFunc
Func Help()
  ConsoleWrite("Help" & @CRLF)
EndFunc
Func _update_list()
  ConsoleWrite("_update_list" & @CRLF)
EndFunc
Func SetFocusSearch()
  ConsoleWrite("SetFocusSearch" & @CRLF)
EndFunc
Func _mark_read()
  ConsoleWrite("_mark_read" & @CRLF)
EndFunc
Func _add_to_worklist()
  ConsoleWrite("_add_to_worklist" & @CRLF)
EndFunc
Func _del_from_worklist()
  ConsoleWrite("_del_from_worklist" & @CRLF)
EndFunc
Func _show_worklist()
  ConsoleWrite("_show_worklist" & @CRLF)
EndFunc
Func _alllist()
  ConsoleWrite("_alllist" & @CRLF)
EndFunc
Func _selection($s, $ss)
  ConsoleWrite("_selection : " & $s & "|" & $ss & @CRLF)
EndFunc
 
Верх