1

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

Помогите, пожалуйста, реализовать отправление виртуального кода клавиши (в случае с буквенными символами) или название клавиши в формате кода методом определения скриптом кода нажатой клавиши и добавления к нему скобок.

Пока пользуюсь таким примитивным способом:


Esc & vk30:: SendRaw {vk30}
Esc & vk31:: SendRaw {vk31}
Esc & vk32:: SendRaw {vk32}
Esc & vk33:: SendRaw {vk33}
Esc & vk34:: SendRaw {vk34}
Esc & vk35:: SendRaw {vk35}
Esc & vk36:: SendRaw {vk36}
Esc & vk37:: SendRaw {vk37}
Esc & vk38:: SendRaw {vk38}
Esc & vk39:: SendRaw {vk39}
Esc & vk41:: SendRaw {vk41}
Esc & vk42:: SendRaw {vk42}
Esc & vk43:: SendRaw {vk43}
Esc & vk44:: SendRaw {vk44}
Esc & vk45:: SendRaw {vk45}
Esc & vk46:: SendRaw {vk46}
Esc & vk47:: SendRaw {vk47}
Esc & vk48:: SendRaw {vk48}
Esc & vk49:: SendRaw {vk49}
Esc & vk4A:: SendRaw {vk4A}
Esc & vk4B:: SendRaw {vk4B}
Esc & vk4C:: SendRaw {vk4C}
Esc & vk4D:: SendRaw {vk4D}
Esc & vk4E:: SendRaw {vk4E}
Esc & vk4F:: SendRaw {vk4F}
Esc & vk50:: SendRaw {vk50}
Esc & vk51:: SendRaw {vk51}
Esc & vk52:: SendRaw {vk52}
Esc & vk53:: SendRaw {vk53}
Esc & vk54:: SendRaw {vk54}
Esc & vk55:: SendRaw {vk55}
Esc & vk56:: SendRaw {vk56}
Esc & vk57:: SendRaw {vk57}
Esc & vk58:: SendRaw {vk58}
Esc & vk59:: SendRaw {vk59}
Esc & vk5A:: SendRaw {vk5A}
Esc & vkBA:: SendRaw {vkBA}
Esc & vkBB:: SendRaw {vkBB}
Esc & vkBC:: SendRaw {vkBC}
Esc & vkBD:: SendRaw {vkBD}
Esc & vkBE:: SendRaw {vkBE}
Esc & vkBF:: SendRaw {vkBF}
Esc & vkC0:: SendRaw {vkC0}
Esc & vkDB:: SendRaw {vkDB}
Esc & vkDC:: SendRaw {vkDC}
Esc & vkDD:: SendRaw {vkDD}
Esc & vkDE:: SendRaw {vkDE}
Esc & vkDF:: SendRaw {vkDF}
Esc & vkE2:: SendRaw {vkE2}

Esc & LControl:: SendRaw {LCtrl}
Esc & RControl:: SendRaw {RCtrl}
Esc & LShift:: SendRaw {LShift}
Esc & RShift:: SendRaw {RShift}
Esc & LAlt:: SendRaw {LAlt}
Esc & RAlt:: SendRaw {RAlt}
Esc & Enter:: SendRaw {Enter}
Esc & Delete:: SendRaw {Delete}
Esc & Insert:: SendRaw {Insert}
Esc & Home:: SendRaw {Home}
Esc & End:: SendRaw {End}
Esc & PGDN:: SendRaw {PGDN}
Esc & PGUP:: SendRaw {PGUP}
Esc & BackSpace:: SendRaw {BackSpace}
Esc & Space:: SendRaw {Space}
Esc & AppsKey:: SendRaw {AppsKey}
Esc & Tab:: SendRaw {Tab}
Esc & PrintScreen:: SendRaw {PrintScreen}
Esc & Pause:: SendRaw {Pause}

Esc & Numpad0:: SendRaw {Numpad0}
Esc & Numpad1:: SendRaw {Numpad1}
Esc & Numpad2:: SendRaw {Numpad2}
Esc & Numpad3:: SendRaw {Numpad3}
Esc & Numpad4:: SendRaw {Numpad4}
Esc & Numpad5:: SendRaw {Numpad5}
Esc & Numpad6:: SendRaw {Numpad6}
Esc & Numpad7:: SendRaw {Numpad7}
Esc & Numpad8:: SendRaw {Numpad8}
Esc & Numpad9:: SendRaw {Numpad9}
Esc & NumpadUp:: SendRaw {NumpadUp}
Esc & NumpadDown:: SendRaw {NumpadDown}
Esc & NumpadLeft:: SendRaw {NumpadLeft}
Esc & NumpadRight:: SendRaw {NumpadRight}
Esc & NumpadAdd:: SendRaw {NumpadAdd}
Esc & NumpadClear:: SendRaw {NumpadClear}
Esc & NumpadDel:: SendRaw {NumpadDel}
Esc & NumpadDiv:: SendRaw {NumpadDiv}
Esc & NumpadDot:: SendRaw {NumpadDot}
Esc & NumpadEnd:: SendRaw {NumpadEnd}
Esc & NumpadEnter:: SendRaw {NumpadEnter}
Esc & NumpadHome:: SendRaw {NumpadHome}
Esc & NumpadIns:: SendRaw {NumpadIns}
Esc & NumpadMult:: SendRaw {NumpadMult}
Esc & NumpadPgdn:: SendRaw {NumpadPgdns}
Esc & NumpadPgup:: SendRaw {NumpadPgup}
Esc & NumpadSub:: SendRaw {NumpadSub}
Esc & NumLock:: SendRaw {NumLock}

Esc & Left:: SendRaw {Left}
Esc & Right:: SendRaw {Right}
Esc & Down:: SendRaw {Down}
Esc & Up:: SendRaw {Up}

Esc & F1:: SendRaw {f1}
Esc & F2:: SendRaw {f2}
Esc & F3:: SendRaw {f3}
Esc & F4:: SendRaw {f4}
Esc & F5:: SendRaw {f5}
Esc & F6:: SendRaw {f6}
Esc & F7:: SendRaw {f7}
Esc & F8:: SendRaw {f8}
Esc & F9:: SendRaw {f9}
Esc & F10:: SendRaw {f10}
Esc & F11:: SendRaw {f11}
Win10x64, AHK v1.1.25

2

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

serzh82saratov реализовал это в AhkSpy. А если нужно прямо печатать виртуальными кодми, то приведённый Вами скрипт как раз подходит.

3 (изменено: serzh82saratov, 2016-05-26 15:23:36)

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

becauseim пишет:

отправление виртуального кода клавиши (в случае с буквенными символами)

Как то предлагал тоже самое покороче, по Esc выводит код, Esc и Shift выводит выводит код в скобках.


#SingleInstance Force

Symbols := "vkBA|vkBB|vkBC|vkBD|vkBE|vkBF|vkC0|vkDB|vkDC|vkDD|vkDE|vk41|vk42|"
            . "vk43|vk44|vk45|vk46|vk47|vk48|vk49|vk4A|vk4B|vk4C|vk4D|vk4E|"
            . "vk4F|vk50|vk51|vk52|vk53|vk54|vk55|vk56|vk57|vk58|vk59|vk5A"

Loop, Parse, Symbols, |
    Hotkey, Esc & %A_LoopField%, InputVK
Return

InputVK:
	Key := SubStr(A_ThisHotkey, InStr(A_ThisHotkey, "&") + 2)
    SendInput, % "{Raw}" (GetKeyState("Shift", "P") ? "{" Key "}" : Key)
    KeyWait, % Key
    Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

4

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

Или так:

Loop  {
	Input, var, L1 E V, {Esc}{LShift}{RShift}
	e := GetKeyState("Esc", "P"), s := GetKeyState("Shift", "P")
	if e && !InStr(ErrorLevel, "EndKey") && vk := Format("vk{:02X}", GetKeyVK(var))
		SendInput, % "{BS}" . (s ? "{{}" vk "{}}" : vk)
}

По Esc выводит код, по Esc + Shift выводит выводит код в скобках.

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

5

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

Input тоже для таких целей раньше пытался использовать, ради короткого кода, но с ним проблемы иногда, пропускает нажатие самой клавиши в систему, пропускает нажатие как таковое, и приведённый выше код символьные клавиши у меня выдаёт как vk00.

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

6

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

Этот и должен пропускать, а символьные можно отрезать, они не нужны.

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

7

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

Понравился последний вариант лаконичностью, т.е. без необходимости перечисления названий. Однако, думаю, что у меня могут возникнуть с ним сложности в плане размещения в файле с остальными сценариями, т.к. я все еще не понял, как размещать циклы, чтобы они не предотврощали работу сценариев, следующих за ними.

Добавьте, пожалуйста, к варианту из 4-го поста условия, аналогично варианту из 3-го поста, для отправления следующих названий клавиш:

+ Список
Esc & LControl:: SendRaw {LCtrl}
Esc & RControl:: SendRaw {RCtrl}
Esc & LShift:: SendRaw {LShift}
Esc & RShift:: SendRaw {RShift}
Esc & LAlt:: SendRaw {LAlt}
Esc & RAlt:: SendRaw {RAlt}
Esc & Enter:: SendRaw {Enter}
Esc & Delete:: SendRaw {Delete}
Esc & Insert:: SendRaw {Insert}
Esc & Home:: SendRaw {Home}
Esc & End:: SendRaw {End}
Esc & PGDN:: SendRaw {PGDN}
Esc & PGUP:: SendRaw {PGUP}
Esc & BackSpace:: SendRaw {BackSpace}
Esc & Space:: SendRaw {Space}
Esc & AppsKey:: SendRaw {AppsKey}
Esc & Tab:: SendRaw {Tab}
Esc & PrintScreen:: SendRaw {PrintScreen}
Esc & Pause:: SendRaw {Pause}

Esc & Numpad0:: SendRaw {Numpad0}
Esc & Numpad1:: SendRaw {Numpad1}
Esc & Numpad2:: SendRaw {Numpad2}
Esc & Numpad3:: SendRaw {Numpad3}
Esc & Numpad4:: SendRaw {Numpad4}
Esc & Numpad5:: SendRaw {Numpad5}
Esc & Numpad6:: SendRaw {Numpad6}
Esc & Numpad7:: SendRaw {Numpad7}
Esc & Numpad8:: SendRaw {Numpad8}
Esc & Numpad9:: SendRaw {Numpad9}
Esc & NumpadUp:: SendRaw {NumpadUp}
Esc & NumpadDown:: SendRaw {NumpadDown}
Esc & NumpadLeft:: SendRaw {NumpadLeft}
Esc & NumpadRight:: SendRaw {NumpadRight}
Esc & NumpadAdd:: SendRaw {NumpadAdd}
Esc & NumpadClear:: SendRaw {NumpadClear}
Esc & NumpadDel:: SendRaw {NumpadDel}
Esc & NumpadDiv:: SendRaw {NumpadDiv}
Esc & NumpadDot:: SendRaw {NumpadDot}
Esc & NumpadEnd:: SendRaw {NumpadEnd}
Esc & NumpadEnter:: SendRaw {NumpadEnter}
Esc & NumpadHome:: SendRaw {NumpadHome}
Esc & NumpadIns:: SendRaw {NumpadIns}
Esc & NumpadMult:: SendRaw {NumpadMult}
Esc & NumpadPgdn:: SendRaw {NumpadPgdns}
Esc & NumpadPgup:: SendRaw {NumpadPgup}
Esc & NumpadSub:: SendRaw {NumpadSub}
Esc & NumLock:: SendRaw {NumLock}

Esc & Left:: SendRaw {Left}
Esc & Right:: SendRaw {Right}
Esc & Down:: SendRaw {Down}
Esc & Up:: SendRaw {Up}

Esc & F1:: SendRaw {f1}
Esc & F2:: SendRaw {f2}
Esc & F3:: SendRaw {f3}
Esc & F4:: SendRaw {f4}
Esc & F5:: SendRaw {f5}
Esc & F6:: SendRaw {f6}
Esc & F7:: SendRaw {f7}
Esc & F8:: SendRaw {f8}
Esc & F9:: SendRaw {f9}
Esc & F10:: SendRaw {f10}
Esc & F11:: SendRaw {f11}

Иными словами, чтобы у буквенных символов отправлялись виртуальные коды, а у всех остальных - названия, которые одинакого воспринимаются при любой раскладке.

Win10x64, AHK v1.1.25

8 (изменено: teadrinker, 2016-05-28 00:56:06)

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

serzh82saratov пишет:

символьные клавиши у меня выдаёт как vk00

А, сразу не понял, оказывается, от раскладки зависит.

becauseim пишет:

могут возникнуть с ним сложности в плане размещения в файле с остальными сценариями

Если с остальными, то так можно:

*Esc::
	Loop  {
		Input, var, L1 E V, {Esc}{LShift}{RShift}
		e := GetKeyState("Esc", "P"), s := GetKeyState("Shift", "P"), end := InStr(ErrorLevel, "EndKey")
		if e && !end && vk := Format( "vk{:02X}", GetKeyVK( ReplaceSimbol(var) ) )
			SendInput, % "{BS}" . (s ? "{{}" vk "{}}" : vk)
	} until !(e || end)
	Return

ReplaceSimbol(sim)
{  
   static Cyr := "ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёйцукенгшщзхъфывапролджэячсмитьбю,.""№;?"
        , Lat := "~QWERTYUIOP{}ASDFGHJKL:""ZXCVBNM<>``qwertyuiop[]asdfghjkl;'zxcvbnm,.?/@#$&"
	Return (found := InStr(Cyr, sim, 1)) ? SubStr(Lat, found, 1) : sim
}

Но этот код предназначен только для печатных символов.
Если для всех и без перечислений — ради интереса сделал, но лаконично не получается:

$*Esc::
	hHookKeybd := SetKbdHook()
	KeyWait, Esc
	DllCall("UnhookWindowsHookEx", Ptr, hHookKeybd)
	Return

LowLevelKeyboardProc(nCode, wParam, lParam)
{
	static oMsg := {0x100: "WM_KEYDOWN", 0x101: "WM_KEYUP"}, ShiftState
	msg  := oMsg[wParam]
	vk   := NumGet(lParam + 0, "UInt")
	ext  := NumGet(lParam + 8, "UInt") & 1
	sc   := NumGet(lParam + 4, "UInt") | ext << 8
	
	if (vk = 0xA0 || vk = 0xA1)
		ShiftState := msg = "WM_KEYDOWN" ? 1 : 0
	
	if ( (vk = 0x1B || vk = 0xA0 || vk = 0xA1) && msg = "WM_KEYUP" && !(ShiftState := "") )
		Return DllCall("CallNextHookEx", Ptr, 0, Int, nCode, Ptr, wParam, Ptr, lParam)
	
	if (msg = "WM_KEYDOWN")  {
		Timer := Func("SendHotkey").Bind(vk, sc, ShiftState)
		SetTimer, % Timer, -10
	}
	Return 1
}

SendHotkey(vk, sc, ShiftState)
{
	global hHookKeybd
	KeyName := GetKeyName( Format("vk{:02X}", vk) . Format("sc{:02X}", sc))
	if KeyName in Escape,LShift,RShift
		Return
	
	char := RegExMatch(KeyName, "i)^[a-z]$")
	DllCall("UnhookWindowsHookEx", Ptr, hHookKeybd)
	if !ShiftState
		SendInput % "{Raw}" (char ? Format("vk{:02X}", vk) : KeyName)
	else
		SendInput % "{Raw}{" (char ? Format("vk{:02X}", vk) : KeyName) "}"
	hHookKeybd := SetKbdHook()
}

SetKbdHook()
{
	Return DllCall("SetWindowsHookEx"
		, Int, WH_KEYBOARD_LL := 13
		, Ptr, RegisterCallback("LowLevelKeyboardProc", "Fast")
		, Ptr, DllCall("GetModuleHandle", UInt, 0, Ptr)
		, UInt, 0, Ptr)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

9 (изменено: serzh82saratov, 2016-05-28 14:03:51)

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

У меня в обоих вариантах не работают символьные.

Если взять функции отсюда, то таким кодом можно печатать с модификаторами (если требуются), а также клавиши джойстика и мыши. Саму клавишу Esc можно напечатать с модификатором.


#NoEnv
#SingleInstance Force

Hotkey_Arr("Func", "Write"), Hotkey_Control("MLRJ")

$Esc::
$<+Esc::
	Hotkey_Arr("Mode", GetKeyState("LShift", "P"))
	If GetKeyState("LShift", "P")
		KeyWait, LShift
	Hotkey_Arr("Hook", 1)
	TrayTip, % "Печать клавиш" . (Hotkey_Arr("Mode") ? " в скобках" : ""), % " ", , 1
	Return
	
Write(K) {
	If (K.Pref = "" && K.HK = "Escape") {
		TrayTip, % "Печать клавиш выключена", % " ", , 2
		Return Hotkey_Reset() 
	}
	If (K.HK = "")
		Return 
	SendStr(K.Pref . (Hotkey_Arr("Mode") ? "{" K.HK "}" : K.HK)) 
}

SendStr(Str) {  
	ControlGetFocus, Ctrl, % "ahk_id" WinExist("A")
	Loop, Parse, Str
		PostMessage, 0x102, Ord(A_LoopField), 1, %Ctrl%   ;  WM_CHAR
}
+ Заменить функцию, если надо без модификаторов.

Write(K) {
	If (K.Pref = "" && K.HK = "Escape") {
		TrayTip, % "Печать клавиш выключена", % " ", , 2
		Return Hotkey_Reset()
	}
	If (K.ModUp && K.HK = "")
		Return
	Key := K.VK = K.HK ? K.HK : K.TK
	SendStr(Hotkey_Arr("Mode") ? "{" Key "}" : Key)
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

10

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

У меня в обоих вариантах не работают символьные.

А это какие именно?

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

11

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

Печатные.

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

12

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

Странно, у меня оба работают идеально на Win7 x64 на обеих версиях AHK. А можешь проверить, что именно не работает? Первый код, вроде, совсем простой. Может, параллельно что-то запущено?

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

13

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

А у тебя работает при русской расскладке по умолчанию?

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

14

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

Во втором варианте лучше заменить на более очевидное:

char := StrLen(KeyName) = 1 && !Instr("1234567890-=", KeyName)

тогда работает. Ну а первый думаю вообще не вариант.

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

15 (изменено: teadrinker, 2016-05-28 21:17:18)

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

А разве эти оба варианта не истину возвращают в случае буквенных клавиш? Я так понял, у тебя с печатными это вариант вообще не работает.

serzh82saratov пишет:

А у тебя работает при русской расскладке по умолчанию?

Не пробовал, попозже. Я не просто так интересуюсь, у меня бывали случаи с заказчиками, когда у меня всё работает идеально, а у них нет.

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

16

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

teadrinker пишет:

А разве эти оба варианта не истину возвращают в случае буквенных клавиш?

Не совсем понял ты про:

char := RegExMatch(KeyName, "i)^[a-z]$")

и

char := StrLen(KeyName) = 1 && !Instr("1234567890-=", KeyName)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

17

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

Ну да:

KeyName := "a"
MsgBox, % char := RegExMatch(KeyName, "i)^[a-z]$")
MsgBox, % char := StrLen(KeyName) = 1 && !Instr("1234567890-=", KeyName)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

18

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

KeyName := "а"
MsgBox, % char := RegExMatch(KeyName, "i)^[a-z]$")
MsgBox, % char := StrLen(KeyName) = 1 && !Instr("1234567890-=", KeyName)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

19

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

KeyName := "/"
MsgBox, % char := RegExMatch(KeyName, "i)^[a-z]$")
MsgBox, % char := StrLen(KeyName) = 1 && !Instr("1234567890-=", KeyName)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

20

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

Так в моём варианте KeyName может быть только латиницей, вроде.

vk := 0x41, sc := 0x1E  ; клавиша a
KeyName := GetKeyName( Format("vk{:02X}", vk) . Format("sc{:02X}", sc))
MsgBox, % char := RegExMatch(KeyName, "i)^[a-z]$")
MsgBox, % char := StrLen(KeyName) = 1 && !Instr("1234567890-=", KeyName)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

21

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

GetKeyName должен вернуть символ текущей раскладки, но у меня почему то твой код всегда возвращает символ раскладки по умолчанию, то есть кирилицу. Хотя одновременно с твоим кодом AhkSpy стабильно выдаёт символ именно текущей раскладки, разницы в коде я не понял.
GetKeyVK должен возвращать код только от символа текущей раскладки, в противном случае будет пусто. Данное поведение функций наблюдаю у себя всегда. Так как в справке такого нет, то может у нас это отличается.

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

22

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

serzh82saratov пишет:

KeyName := "/"

Так я пока только про буквенные говорю.

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

23

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

Ладно, потом с другой раскладкой проверю.

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

24

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

teadrinker пишет:

Так в моём варианте KeyName может быть только латиницей, вроде.

В случае с "/" всё равно ведь не правильно. Опять же мало ли какие клавиатуры и раскладки, зачем перечислять все известные а потом неизвестные варианты. По моему надёжнее и проще так:

StrLen(KeyName) = 1 && !Instr("1234567890-=", KeyName)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

25

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

teadrinker пишет:

Так я пока только про буквенные говорю.

Я думал мы говорим про сценарий который выдаёт вк коды всех тех клавиш, которые нуждаются в этом для независимости от раскладки, и именах остальных.

becauseim пишет:

Иными словами, чтобы у буквенных символов отправлялись виртуальные коды, а у всех остальных - названия, которые одинакого воспринимаются при любой раскладке.

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

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.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

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.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

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.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

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.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

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.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

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.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui