Что нового

Можно ли назначать HotKeySet, определенной программе?

Сообщения
17
Репутация
-1
Здраствуйте вот мой код


Код:
#include <WinAPIEx.au3>

_FixAccelHotKeyLayout()  ; Fix чтобы можно было выставлять русскую раскладку клавиатуры по умолчанию, при загрузке Windows

Func _FixAccelHotKeyLayout()
    Static $iKbrdLayout, $aKbrdLayouts

    If Execute('@exitMethod') <> '' Then
        Local $iUnLoad = 1

        For $i = 1 To Ubound($aKbrdLayouts) - 1
            If Hex($iKbrdLayout) = Hex('0x' & StringRight($aKbrdLayouts[$i], 4)) Then
                $iUnLoad = 0
                ExitLoop
            EndIf
        Next

        If $iUnLoad Then
            _WinAPI_UnloadKeyboardLayout($iKbrdLayout)
        EndIf

        Return
    EndIf

    $iKbrdLayout = 0x0409
    $aKbrdLayouts = _WinAPI_GetKeyboardLayoutList()
    _WinAPI_LoadKeyboardLayout($iKbrdLayout, $KLF_ACTIVATE)

    OnAutoItExitRegister('_FixAccelHotKeyLayout')
 EndFunc

#include <Constants.au3>

HotKeySet("{HOME}", "func1")  ; сочетание клавиш Ctrl+SHIFT+C (для Autocad)
HotKeySet("{END}", "func2") ; сочетание клавиш Ctrl+W (для Autocad)
HotKeySet("{NUMPADDOT}", "func3") ; точка или запятая на NUMPAD
HotKeySet("{INSERT}", "func4") ; сочетание клавиш Ctrl+C
HotKeySet("{PGUP}", "func5") ; сочетание клавиш Ctrl+V
HotKeySet("{PGDN}", "func6") ; сочетание клавиш Ctrl+M (для Autocad)
HotKeySet("{PAUSE}", "func7") ; сочетание клавиш ALT+F4
HotKeySet("{SCROLLLOCK}", "func8") ; сочетание клавиш TAB

Opt("TrayMenuMode", 1) ; Default tray menu items (Script Paused/Exit) will not be shown

Local $my1item = TrayCreateItem("Запятая", -1, -1, 1)
TrayItemSetState(-1, $TRAY_CHECKED)
Local $my2item = TrayCreateItem("Точка", -1, -1, 1)
TrayCreateItem("")
Local $showinfo = TrayCreateItem("О программе")
TrayCreateItem("")
Local $exititem = TrayCreateItem("Exit")

Local $myitem = 1

TraySetState()

While 1
   Local $msg = TrayGetMsg()
    Select
      Case $msg = 0
         ContinueLoop
      Case $msg = $my1item
         $myitem = 1
         ContinueLoop
      Case $msg = $my2item
         $myitem = 2
         ContinueLoop
      Case $msg = $exititem
         ExitLoop
      Case $msg = $showinfo
         MsgBox(0, "О программе", "Автор: Дмитрий Руденко" & @LF & "E-mail: [email protected]" & @LF & "http://fordewind.org/" & @LF & "Программа распространяется бесплатно")
         ContinueLoop
    EndSelect
WEnd

Func func1()
   Send("^+{c}")
EndFunc

Func func2()
   Send("^{w}")
EndFunc



Func func3()
   sleep(35)
   IF $myitem = 1 then
      send("{ASC 044}")
   ElseIf $myitem = 2 Then
      send("{ASC 046}")
   EndIf
EndFunc

Func func4()
  Send("^{c}")
EndFunc

Func func5()
   Send("^{v}")
EndFunc

Func func6()
   Send("^{m}")
EndFunc

Func func7()
   Send("!{F4}")
EndFunc

Func func8()
   Send("{TAB}")
EndFunc


Помогите, чтобы HotKeySet предназначены, для Autocad, работали только в самом Autocad, соответствено чтобы у меня появилась возможность добавлять другие сочетания клавиш на эти HotKey для других программ.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
HotKeySet('{f6}','fu1')
While 1
	Sleep(100)
WEnd
Func fu1()
	Select
		Case WinActive('Autocad')
			HotKeySet(@HotKeyPressed)
			Send(@HotKeyPressed)
			HotKeySet(@HotKeyPressed, 'fu1')
	EndSelect
EndFunc
 
Автор
N
Сообщения
17
Репутация
-1
Спасибо, так быстро ,буду разбираться
 

Oki

Продвинутый
Сообщения
452
Репутация
62
Код:
Func fu1()
    Select
        Case WinActive('Autocad')
            HotKeySet(@HotKeyPressed)
            Send(@HotKeyPressed)
            HotKeySet(@HotKeyPressed, 'fu1')
    EndSelect
EndFunc
Select, лишь бы выпендриться?
Код:
Func fu1()
    If WinActive('Autocad') Then
        HotKeySet(@HotKeyPressed)
        Send(@HotKeyPressed)
        HotKeySet(@HotKeyPressed, 'fu1')
    EndIf
EndFunc
И вообще, топикстартер не это действие, похоже, имел в виду. Нужно тем же самым If обусловить то же действие, которое у него в скрипте и так есть.
 
Автор
N
Сообщения
17
Репутация
-1
Ну несмотря на свою тупорылость, я состряпал подобие того что мне нужно
Код:
HotKeySet('{f6}','fu1')

While 1
    Sleep(100)
 WEnd

Func fu1()
    Select
    Case WinActive("Безымянный – Блокнот")
       Opt("WinTitleMatchMode", 2)
            Send("{ASC 046}")
         Case Else
            Send("{ASC 044}")
    EndSelect
EndFunc

Единственное что при сохранение файла, меняиться заголовок, и скрипт перестает работать как надо
 

Oki

Продвинутый
Сообщения
452
Репутация
62
Чтобы изменение заголовка не повлияло, нужно подхватить дескриптор окна, пока заголовок не менялся, и далее работать с дескриптором.
Код:
HotKeySet("{f6}", "fu1")
$hWnd = 0
While 1
    If $hWnd = 0 Then
        $hWnd  = WinActive("Безымянный – Блокнот")
    EndIf
    Sleep(100)
 WEnd
Func fu1()
    If WinActive($hWnd) Then
        Send("{ASC 046}")
    Else
        Send("{ASC 044}")
    EndIf
EndFunc
Или искать заголовки, похожие на шаблон.
 
Автор
N
Сообщения
17
Репутация
-1
А почему мне
Код:
("WinTitleMatchMode", 2)
не помог, если заголовок поменялся на
Код:
("1 – Блокнот")
?
 

Oki

Продвинутый
Сообщения
452
Репутация
62
А почему мне
Код:
("WinTitleMatchMode", 2)
не помог, если заголовок поменялся на
Код:
("1 – Блокнот")
?
Во-первых, вообще непонятно, зачем лепить смену опции внутрь условного оператора. Опция должна быть установлена один раз в самом начале скрипта (даже не функции), если нет каких-то собых причин делать иначе. Во-вторых, чтобы поиск по подстроке сработал, нужно в строку запроса поставить именно подстроку, а не просто что-то напоминающее искомое. Например, просто "Блокнот". А в строке "1 – Блокнот" нет подстроки "Безымянный – Блокнот", поэтому нечему удивляться.

Кстати, есть ещё вариант искать вместо заголовка класс, в справке такой вариант тоже пристутствует. Это может оказаться надёжнее, чем надеяться на то, что в заголовке какото-то иного окна не будет того же искомого слова.
 
Верх