1 (изменено: astira, 2012-09-25 14:10:54)

Тема: AHK: Баг с залипанием клавиш

Имеется следующий код, который вставляет макросы в Confluence при нажатии сочетаний клавиш.

SaveSelectedTextAndOpenWikiDialog()
{
	global tCl
	tCl := Clipboard	
	Sleep, 50
	Send, {CTRLDOWN}{vk58}{CTRLUP}
	Send, {CTRLDOWN}{SHIFTDOWN}{vk44}{SHIFTUP}{CTRLUP}
}

CloseWikiDialogAndRestoreClipboard()
{
	global tCl
	Send, {Tab}	
	Send, {Enter}
	Clipboard := tCl
}

WikiConfHotKey(FirstWikiTag, SecondWikiTag = "")
{
	SaveSelectedTextAndOpenWikiDialog()
	SendInput %FirstWikiTag%
	SendInput {Enter}
	if SecondWikiTag <>
	{
		SendInput %SecondWikiTag%
		SendInput {Enter}
	}
	Send {CTRLDOWN}{vk56}{CTRLUP}
	SendInput {Enter}
	if SecondWikiTag <>			
	{
		SendInput %SecondWikiTag%
		SendInput {Enter}
	}
	SendInput %FirstWikiTag%
	SendInput {Enter}
	CloseWikiDialogAndRestoreClipboard()
	return 
}

#!q::
WikiConfHotKey("{Raw}{quote}")
return 

#!e::
WikiConfHotKey("{Raw}{expand}")
return 

#!c::
WikiConfHotKey("{Raw}{code}")
return 

#!n::
WikiConfHotKey("{Raw}{note}")
return 

#!i::
WikiConfHotKey("{Raw}{info}")
return 

#!t::
WikiConfHotKey("{Raw}{tip}")
return 

#!w::
WikiConfHotKey("{Raw}{warning}")
return 

#!p::
WikiConfHotKey("{Raw}{panel}")
return 

#!a::
	SaveSelectedTextAndOpenWikiDialog()
	SendInput, {Raw}{anchor:%Clipboard%}
	;
	CloseWikiDialogAndRestoreClipboard()
return 


#!r::
	SaveSelectedTextAndOpenWikiDialog()
	SendInput {Raw}{expand:Код PB}
	SendInput {Enter}

	SendInput {Raw}{code:lang=javascript}
	SendInput {Enter}

	Send {CTRLDOWN}{vk56}{CTRLUP}
	SendInput {Enter}
	SendInput {Raw}{code}
	SendInput {Enter}
	SendInput {Raw}{expand}
	SendInput {Enter}
	CloseWikiDialogAndRestoreClipboard()
return

#!l::
	SaveSelectedTextAndOpenWikiDialog()
	SendInput, {Raw}[%Clipboard%|%tCl%#%Clipboard%]
	CloseWikiDialogAndRestoreClipboard()
return

Иногда творится какая-то билеберда.
Например, блокируется пользователь (Win+L). Браузер реагирует, как будто пытались закрыть окно.

Я добавил следующий хоткей.


*F12::
	MsgBox, % "LShift = " GetKeyState("LShift", "P") "`nLWin  = " GetKeyState("LWin", "P")  "`nLCtrl   = " GetKeyState("LCtrl", "P") "`nLAlt    = " GetKeyState("LAlt", "P")
	Return

Иногда в окне показывается, что, например, Alt или LWin зажаты.

Кто-нибудь может объяснить, как это происходит? Заранее большое спасибо.

2 (изменено: creature.ws, 2012-09-25 17:59:52)

Re: AHK: Баг с залипанием клавиш

Команды Send очень дружелюбны к пользователю, стараются «сделать как надо» несмотря ни на что.

Кто-нибудь может объяснить, как это происходит

Вызов процедур в которых выполняется команда Send вы производите при нажатии сочетания клавиш.
В момент выполнения команды Send вы, вероятно, еще не отпустили модификаторы используемые в данном сочетании.
Send перед «вводом какого-то текста» «отжимает» зажатые модификаторы, чтоб, если в тексте содержатся символы отправить которые можно эмулируя нажатия клавиш, нажатия не воспринимались как системные сочетания «модификатор + клавиша».
Возможно, система не всегда корректно воспринимает «отжатие» модификаторов alt, win и прочих.
Решением проблемы будет выполнять требуемые процедуры при отпускании всех модификаторов, используемых в горячей клавише.
Например:

#!r up::
    KeyWait, Lwin
    KeyWait, Rwin
    KeyWait, alt
    ; …

3

Re: AHK: Баг с залипанием клавиш

На первый взгляд - помогло!
Благодарю.
Будем тестировать дальше.