26

Re: AHK: Отправление виртуального кода клавиши

serzh82saratov пишет:

По моему надёжнее и проще так

Ну, это уже детали. Можно через RegEx в одно выражение. Я о принципе определения интересовался, работает, или нет.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

27 (изменено: serzh82saratov, 2016-05-29 02:24:16)

Re: AHK: Отправление виртуального кода клавиши

Ещё так можно назначить все кнопки, включая мышь.

#NoEnv 
SetBatchLines -1
ListLines Off

Loop % 0xFF + 0xFFF
	If ((Name := Name(A_Index)) != "")
		Hotkey, % "Esc & " Name, Input
Return

Input() {
	Key := SubStr(A_ThisHotkey, InStr(A_ThisHotkey, "&") + 2)
    SendInput, % "{Raw}" (GetKeyState("Shift", "P") ? "{" Key "}" : Key) 
	KeyWait, % (Instr(Key, "Wheel") ? "" : Key)
}

Name(I) {
	Code := Format((I > 0xFF ? "sc" : "vk") "{:X}", I - (I > 0xFF ? 0xFF : 0))
	Name := GetKeyName(Code), Chr := StrLen(Name) = 1 && !Instr("1234567890-=", Name)
	Return Chr ? (Instr(Code, "sc") ? "" : Code) : (Instr(Name, "Shift") ? "" : Name)
}
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.01 (Unicode 32-bit).

28 (изменено: serzh82saratov, 2016-05-29 05:27:57)

Re: AHK: Отправление виртуального кода клавиши

Кстати SendInput подводит например в случае с Escape & LWin, и запускает при печати Win+L. Потому лучше отправлять через WM_CHAR, либо печатать после KeyWait.

#NoEnv
SetBatchLines -1
ListLines Off

Loop % 0xFF + 0x153
	If ((Name := Name(A_Index)) != "")
		Hotkey, % "Esc & " Name, Input
Return

Input() {
	Key := SubStr(A_ThisHotkey, InStr(A_ThisHotkey, "&") + 2)
	SendStr(GetKeyState("Shift", "P") ? "{" Key "}" : Key)
	KeyWait, % (Instr(Key, "Wheel") ? "" : Key)
}

Name(I) {
	Static Names := {}
	Code := Format((I > 0xFF ? "sc" : "vk") "{:X}", I - (I > 0xFF ? 0xFF : 0))
	If Names[Name := GetKeyName(Code)]
		Return
	Names[Name] := 1, Chr := StrLen(Name) = 1 && !Instr("1234567890-=", Name)
	Return Chr ? (Instr(Code, "sc") ? "" : Code) : (Instr(Name, "Shift") ? "" : Name)
}

SendStr(Str) {  
	ControlGetFocus, Ctrl, % "ahk_id" WinExist("A")
	Loop, Parse, Str
		PostMessage, 0x102, Ord(A_LoopField), 1, %Ctrl%   ;  WM_CHAR
}
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.01 (Unicode 32-bit).

29

Re: AHK: Отправление виртуального кода клавиши

serzh82saratov, последний вариант работает идеально, то, что нужно! Правда, например, я больше перечисляю отправляиваемые клавиши, нежели задаю горячие, и, наверное, было бы удобнее поменять местами условия, при нажатии на Esc и Shift+Esc. Но это мелочи, можно привыкнуть.

Более всего для меня вновь затруднительно разместить сценарий в одном файле с другими, т.к. при расположении сценария в конце файла он не работает, а в начале - предотвращает отображение GUI и, например, TrayMenu. Я уже несколько раз интересовался по поводу этого вопроса, однако для меня он по-прежнему остался открытым, т.к. даже после прочтения справки мне не ясно, существует ли способ, который полностью разделяет сценарии для предотвращения воздействия друг на друга или же это безвыходная ситуация, когда единственным решением может быть разделение на два файла.

Win10x64, AHK v1.1.25

30

Re: AHK: Отправление виртуального кода клавиши

becauseim пишет:

Но это мелочи, можно привыкнуть.

Или тут просто фигурные скобки переставить:

SendStr(GetKeyState("Shift", "P") ? "{" Key "}" : Key)
becauseim пишет:

при расположении сценария в конце файла он не работает

Тут ещё проще, тут же сразу идёт Return, то есть то что до него

Loop % 0xFF + 0x153
	If ((Name := Name(A_Index)) != "")
		Hotkey, % "Esc & " Name, Input

надо поместить до своих циклов, вверху, то что называют в справке "секция автовыполнения", то что после Return поместить после циклов.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.01 (Unicode 32-bit).

31

Re: AHK: Отправление виртуального кода клавиши

serzh82saratov, спасибо, все получилось!

Win10x64, AHK v1.1.25

32

Re: AHK: Отправление виртуального кода клавиши

А если так:

#NoEnv
SetBatchLines -1
ListLines Off

Loop % 0xFF + 0x153
	If ((Name := Name(A_Index)) != "")
		Hotkey, % "Esc & " Name, Input
Return

Input() {
	Key := SubStr(A_ThisHotkey, InStr(A_ThisHotkey, "&") + 2)
	SendStr(GetKeyState("Shift", "P") ? "{" Key "}" : Key)
	KeyWait, % (Instr(Key, "Wheel") ? "" : Key)
}

Name(I) {
	Static Names := {}
	Code := Format((I > 0xFF ? "sc" : "vk") "{:X}", I - (I > 0xFF ? 0xFF : 0))
	If Names[Name := GetKeyName(Code)]
		Return
	Names[Name] := 1, Chr := StrLen(Name) = 1 && !Instr("1234567890-=", Name)
	Return Chr ? (Instr(Code, "sc") ? "" : Code) : (Instr(Name, "Shift") ? "" : Name)
}

SendStr(Str) {  
	ControlGetFocus, Ctrl, % "ahk_id" WinExist("A")
	Loop, Parse, Str
		PostMessage, 0x102, Ord(A_LoopField), 1, %Ctrl%   ;  WM_CHAR
}

#IfWinActive, ahk_class Notepade
^Space:: MsgBox

?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

33

Re: AHK: Отправление виртуального кода клавиши

А что не так, вроде всё работает.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.01 (Unicode 32-bit).

34

Re: AHK: Отправление виртуального кода клавиши

У меня не работает ни печать, ни моя горячая клавиша.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

35

Re: AHK: Отправление виртуального кода клавиши

Попробуй закрыть условие, и класс правильно прописать.

#IfWinActive, ahk_class Notepad
^Space:: MsgBox 
#IfWinActive
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.01 (Unicode 32-bit).

36

Re: AHK: Отправление виртуального кода клавиши

А, нет, неправильно класс написал:

#IfWinActive, ahk_class Notepade

Если правильно, моя работает, но печать — нет.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

37

Re: AHK: Отправление виртуального кода клавиши

serzh82saratov пишет:

Попробуй закрыть условие, и класс правильно прописать.

Ага, так работает.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

38

Re: AHK: Отправление виртуального кода клавиши

serzh82saratov, Задействованная в сочетании клавиша Esc не работает в отдельности, т.е. сама по себе. Как это исправить?

Loop % 0xFF + 0x153
	If ((Name := Name(A_Index)) != "")
		Hotkey, % "Esc & " Name, Input
Win10x64, AHK v1.1.25

39

Re: AHK: Отправление виртуального кода клавиши

Hotkey, % "~Esc & " Name, Input
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.01 (Unicode 32-bit).