如何使用 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%
    }
}