Это тут уже бурно обсуждалось. Так они не становятся последними зарегистрированными. То есть если перед запуском Window Spy, запущен другой скрипт в котором есть 1Joy1:: то он не будет определён в Window Spy. Думаю это критично для кода определяющего кнопки . Да и справка советует в таких случаях записывать хоткеи как метки. Сам люблю лаконичность в коде, но здесь оно ни к чему. Товарищ Irbis приводил туже ссылку на индусский код. Повторюсь что предлагаемый вами вариант записи был первым пришедшим в голову, но я от него отказался. Почему все в первую очередь пытаются в других увидеть тупость? Можно ведь сначала спросить, почему так, и уже после упражнятся мягко говоря в сарказме.
teadrinker пишет:это непросто.
Нужно только это:
HF_Hotkey( Option = "", HF_UserFunc = "") { ;***
Global
Static HF_IsStart
If !HF_IsStart
{
OnMessage(0x6, "HF_WM_ACTIVATE")
HF_ModButtons := {"vkA4":"Alt","vkA5":"Alt","vkA2":"Ctrl","vkA3":"Ctrl","vkA0":"Shift","vkA1":"Shift","vk5B":"Win","vk5C":"Win"}
HF_PrefMod := {"Alt":"!","Ctrl":"^","Shift":"+","Win":"#"}
HF_Buttons := "|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|" ; 37 Letter Buttons
SetBatchLines -1
OnExit, HF_Exit
HF_PoiWrite := RegisterCallback("HF_Write", "Fast")
HF_IsStart := 1
}
HF_UserFuncName := (HF_UserFunc = "") ? HF_UserFuncName : HF_UserFunc
If ( Option = "T" )
Option := HF_State = "" ? "ON" : "OFF"
If ( Option = "OFF" )
HF_Unhook() , HF_Man := 1
Else If ( Option = "ON" )
HF_Hook() , HF_Man := 0
HF_CleanMod()
Return HF_State
HF_Exit:
DllCall("UnhookWindowsHookEx", UInt, HF_State)
SendInput, {LShift Up}{RShift Up}{LButton Up}{LCtrl Up}{RCtrl Up}{LAlt Up}{RAlt Up}{LWin Up}{RWin Up}
ExitApp
} ;**
HF_Write(HF_nCode, HF_wParam, HF_lParam) { ;***
Global
Critical
SetFormat, IntegerFast, H
HF_VkCode := "vk" SubStr( NumGet(HF_lParam+0), 3)
HF_SCCode := "sc" SubStr(((NumGet(HF_lParam+0, 8) & 1) <<8) | NumGet(HF_lParam+0, 4), 3)
IF (HF_wParam = 0x100 || HF_wParam = 0x104) ; WM_KEYDOWN = 0x100, WM_SYSKEYDOWN = 0x104
{
IF HF_IS_Mod := HF_ModButtons[HF_VkCode]
GoTo, HF_PressMod
IF ( HF_PrCode = HF_SCCode )
Return 1
GoTo, HF_Write
}
IF HF_IS_Mod := HF_ModButtons[HF_VkCode]
GoTo, HF_PressMod_Up
Return 1
HF_PressMod_Up:
HF_Mod%HF_IS_Mod% := HF_PrefMod%HF_IS_Mod% := ""
If (HF_Hotkey != "")
Return 1
GoTo, HF_Write
HF_PressMod:
If HF_Mod%HF_IS_Mod% <>
Return 1
HF_Mod%HF_IS_Mod% := HF_IS_Mod "+" , HF_PrefMod%HF_IS_Mod% := HF_PrefMod[HF_IS_Mod] , HF_Hotkey := ""
HF_Write:
HF_PrCode := HF_SCCode , HF_KeyName := HF_ThisKey := GetKeyName(HF_VkCode HF_SCCode)
(HF_IS_Mod != "") ? (HF_KeyName := HF_Prefix := "" , HF_DelStr := 1)
: (HF_Prefix := HF_PrefModCtrl HF_PrefModAlt HF_PrefModShift HF_PrefModWin
, (HF_Hotkey := InStr(HF_Buttons, "|" HF_VkCode "|") ? HF_VkCode : HF_ThisKey) , HF_PrCode := HF_DelStr := "")
If (HF_PR_Result = HF_ModCtrl HF_ModAlt HF_ModShift HF_ModWin HF_KeyName HF_Prefix HF_Hotkey HF_VkCode HF_ThisKey)
Return 1
%HF_UserFuncName%(HF_ModCtrl HF_ModAlt HF_ModShift HF_ModWin, HF_KeyName, HF_Prefix, HF_Hotkey, HF_VkCode, HF_ThisKey)
HF_PR_Result := HF_ModCtrl HF_ModAlt HF_ModShift HF_ModWin HF_KeyName HF_Prefix HF_Hotkey HF_VkCode HF_ThisKey
Return 1
} ;**
HF_WM_ACTIVATE(HF_wp) { ;***
Global
IF (HF_wp & 0xFFFF = 0 && HF_State )
HF_Unhook() , HF_ExtFunc("HF_WinStatus", 0)
IF (HF_wp & 0xFFFF && !HF_State && !HF_Man)
HF_Hook() , HF_ExtFunc("HF_WinStatus", 1)
} ;**
HF_ExtFunc(F, V) { ;***
If IsFunc(F)
%F%(V)
} ;**
HF_Unhook() { ;***
Global
DllCall("UnhookWindowsHookEx", UInt, HF_State)
HF_State := "" , HF_CleanMod()
If HF_DelStr
%HF_UserFuncName%("", "", "", "", HF_VkCode, HF_ThisKey)
SendInput, {LShift Up}{RShift Up}{LCtrl Up}{RCtrl Up}{LAlt Up}{RAlt Up}{LWin Up}{RWin Up}
} ;**
HF_Hook() { ;***
Global
HF_DelStr := ""
HF_State := DllCall("SetWindowsHookEx", Int, 13, UInt, HF_PoiWrite, UInt, DllCall("GetModuleHandle", UInt, 0), UInt, 0)
} ;**
HF_CleanMod() { ;***
Global
HF_PR_Result := HF_PrCode := HF_ModCtrl := HF_ModAlt := HF_ModShift := HF_ModWin := ""
HF_PrefModCtrl := HF_PrefModAlt := HF_PrefModShift := HF_PrefModWin := HF_Prefix := ""
} ;**
остальное (можно удалить) написано для определения кнопок джойстиков и мыши, и врядли как то может относится к проблеме. Причём данная проблема не замечалась мною в похожем варианте использования SetWindowsHookEx. В аттаче пример использования.
Post's attachmentsHotkey.ahk 7.6 kb, 3 downloads since 2013-08-05
You don't have the permssions to download the attachments of this post.
По вопросам возмездной помощи пишите на
E-Mail: serzh82saratov@mail.ru Telegram:
https://t.me/sergiol982Win10x64
AhkSpy,
Hotkey,
ClockGui