如何使用AHK实现类似视觉工作室的链式热键?

问题描述 投票:1回答:2

我正在尝试为工作中的某些东西实现视觉工作室般的热键链接。

基本上,当我按下Ctrl + Alt + F时,我想进入一种“格式化模式”我按下的下一个键将决定注入的文本。一旦按下其中一个内部热键,我希望“格式化模式”停止。但是我也想要选择必须手动取消以防万一。

我已经尝试搜索热键的链接,以及尝试以下,相当天真的代码:

;
;; 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的经历一样。

autohotkey hotkeys chaining
2个回答
2
投票

使用#if命令,您可以使用相同的热键在action1 / Enable和action2 / Disable之间切换/切换。

你可以在记事本中测试它。如果你然后键入键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 

2
投票

正如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%
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.