如何使用 AHK 实现类似 visual-studio 的链接热键?
How to achieve visual-studio-like chained hotkeys using AHK?
我正在努力为工作中的某些事情实现类似视觉工作室的热键链接。
基本上,当我按下 Ctrl+Alt+F 时,我想输入一种 "Format mode" 我按下的下一个键将确定要注入的文本。我希望 "Format mode" 在按下其中一个内部热键后立即停止。但是,我也希望可以选择手动取消它以防万一。
我已经尝试搜索热键链接,并尝试了以下相当幼稚的代码:
;
;; Format Mode
;
^+f::
; Bold
b::
Send "<b></b>"
Send {Left 4}
return
; Italics
i::
Send "<i></i>"
Send {Left 4}
return
; Bulleted List
u::
Send "<u></u>"
Send {Left 4}
return
; Numbered List
o::
Send "<o></o>"
Send {Left 4}
return
; List Item
l::
Send "<li></li>"
Send {Left 4}
return
; Line Break
r::
Send "<br/>"
return
return
我漂亮确定这行不通,但我想我会试一试,以免让你们都认为我只是要求用勺子喂食。
我并没有经常使用 AHK,但我已经足够使用它来在家里和工作中完成一些事情,但是它太混乱了——就像我的经验背景一样与 AHK.
使用 #if
命令,您可以使用相同的热键在 action1/Enable 和 action2/Disable 之间 Switch/Toggle。
您可以在记事本中测试一下。如果您随后键入键 t
键入 Ctrl+Shift+f 键可在两个相同的热键之间切换。
注意:对于您的热键,您可以稍微更改代码!您可以将所有热键放入#if Mode1,然后不使用热键进入#if Mode2
Example1.ahk
; [+ = Shift] [! = Alt] [^ = Ctrl] [# = Win]
#SingleInstance force
a := 1
#If mode1 ; All hotkeys below this line will only work if mode1 is TRUE or 1
t::
send 1
; Here you can put your first hotkey code
return
; Here you can Place All your Hotkeys
#If
#If mode2 ; All hotkeys below this line will only work if mode2 is TRUE or 1
t::
send 2
; And here you can put your second hotkey code
return
#If
; toggle between [t::1] and [t::2]
;a = 1 => t::1
;a = 2 => t::2
;type Ctrl+Shift+f keys to toggle between two the same hotkeys
;you can test it out in notepad - if you then type the key t
^+f::
if (a=1)
{
mode1 = 1
mode2 = 0
a := 2
}else{
mode1 = 0
mode2 = 1
a := 1
}
return
esc::exitapp
如 stevecody 所示,使用 #If
是一个不错的选择。以下是可能适合您的另一种解决方案。它使用您的 ^+f
热键来激活专业热键。专用热键也会在使用时自行停用。 f1
是您手动取消它的选项。
^+f::
Hotkey , b , l_Bold , On
Hotkey , i , l_Italics , On
Hotkey , l , l_ListItem , On
Return
f1::
Hotkey , b , l_Bold , Off
Hotkey , i , l_Italics , Off
Hotkey , l , l_ListItem , Off
Return
l_Bold:
Hotkey , b , l_Bold , Off
Send , <b></b>{left 4}
Return
l_Italics:
Hotkey , i , l_Italics , Off
Send , <i></i>{left 4}
Return
l_Italics:
Hotkey , l , l_ListItem , Off
Send , <li></li>{left 5}
Return
下面是我正在查看的其他内容,但效果不佳。问题是它仍然会发送专业密钥,你最终会得到类似 <i>i</i>
而不是 <i></i>
.
的东西
f1::
KeyBdHook := DllCall( "SetWindowsHookEx" , "int" , 13 , "uint" , RegisterCallback( "KeyBdProc" ) , "uint" , 0 , "uint" , 0 )
input
Return
KeyBdProc( nCode , wParam , lParam )
{
global KeyBdHook
Critical
If ( wParam = 0x100 )
{
DllCall( "UnhookWindowsHookEx" , "ptr" , KeyBdHook )
sKey := GetKeyName( Format( "vk{:x}" , NumGet( lParam + 0 , 0 , "int" ) ) )
If ( sKey = "i" )
Send , <i></i>{left 4}
Else
MsgBox , You pressed %sKey%
}
}
我正在努力为工作中的某些事情实现类似视觉工作室的热键链接。
基本上,当我按下 Ctrl+Alt+F 时,我想输入一种 "Format mode" 我按下的下一个键将确定要注入的文本。我希望 "Format mode" 在按下其中一个内部热键后立即停止。但是,我也希望可以选择手动取消它以防万一。
我已经尝试搜索热键链接,并尝试了以下相当幼稚的代码:
;
;; Format Mode
;
^+f::
; Bold
b::
Send "<b></b>"
Send {Left 4}
return
; Italics
i::
Send "<i></i>"
Send {Left 4}
return
; Bulleted List
u::
Send "<u></u>"
Send {Left 4}
return
; Numbered List
o::
Send "<o></o>"
Send {Left 4}
return
; List Item
l::
Send "<li></li>"
Send {Left 4}
return
; Line Break
r::
Send "<br/>"
return
return
我漂亮确定这行不通,但我想我会试一试,以免让你们都认为我只是要求用勺子喂食。
我并没有经常使用 AHK,但我已经足够使用它来在家里和工作中完成一些事情,但是它太混乱了——就像我的经验背景一样与 AHK.
使用 #if
命令,您可以使用相同的热键在 action1/Enable 和 action2/Disable 之间 Switch/Toggle。
您可以在记事本中测试一下。如果您随后键入键 t
键入 Ctrl+Shift+f 键可在两个相同的热键之间切换。
注意:对于您的热键,您可以稍微更改代码!您可以将所有热键放入#if Mode1,然后不使用热键进入#if Mode2
Example1.ahk
; [+ = Shift] [! = Alt] [^ = Ctrl] [# = Win]
#SingleInstance force
a := 1
#If mode1 ; All hotkeys below this line will only work if mode1 is TRUE or 1
t::
send 1
; Here you can put your first hotkey code
return
; Here you can Place All your Hotkeys
#If
#If mode2 ; All hotkeys below this line will only work if mode2 is TRUE or 1
t::
send 2
; And here you can put your second hotkey code
return
#If
; toggle between [t::1] and [t::2]
;a = 1 => t::1
;a = 2 => t::2
;type Ctrl+Shift+f keys to toggle between two the same hotkeys
;you can test it out in notepad - if you then type the key t
^+f::
if (a=1)
{
mode1 = 1
mode2 = 0
a := 2
}else{
mode1 = 0
mode2 = 1
a := 1
}
return
esc::exitapp
如 stevecody 所示,使用 #If
是一个不错的选择。以下是可能适合您的另一种解决方案。它使用您的 ^+f
热键来激活专业热键。专用热键也会在使用时自行停用。 f1
是您手动取消它的选项。
^+f::
Hotkey , b , l_Bold , On
Hotkey , i , l_Italics , On
Hotkey , l , l_ListItem , On
Return
f1::
Hotkey , b , l_Bold , Off
Hotkey , i , l_Italics , Off
Hotkey , l , l_ListItem , Off
Return
l_Bold:
Hotkey , b , l_Bold , Off
Send , <b></b>{left 4}
Return
l_Italics:
Hotkey , i , l_Italics , Off
Send , <i></i>{left 4}
Return
l_Italics:
Hotkey , l , l_ListItem , Off
Send , <li></li>{left 5}
Return
下面是我正在查看的其他内容,但效果不佳。问题是它仍然会发送专业密钥,你最终会得到类似 <i>i</i>
而不是 <i></i>
.
f1::
KeyBdHook := DllCall( "SetWindowsHookEx" , "int" , 13 , "uint" , RegisterCallback( "KeyBdProc" ) , "uint" , 0 , "uint" , 0 )
input
Return
KeyBdProc( nCode , wParam , lParam )
{
global KeyBdHook
Critical
If ( wParam = 0x100 )
{
DllCall( "UnhookWindowsHookEx" , "ptr" , KeyBdHook )
sKey := GetKeyName( Format( "vk{:x}" , NumGet( lParam + 0 , 0 , "int" ) ) )
If ( sKey = "i" )
Send , <i></i>{left 4}
Else
MsgBox , You pressed %sKey%
}
}