[AutoHotkey] 怎样让空格键做修饰键时是shift,单独按时仍然是空格?

希望最终效果:

① 按 空格+a/b/…/z/1/2/…/0/鼠标左键 /右键,映射成 shift+a/b/…/z/1/2/…/0/鼠标左键 /右键

② 按 空格+鼠标左键 框选,映射成 shift+鼠标左键 框选

③ 单独按 空格,就还是空格

试了两种方法,都不行:

第一种:

space::LShift,但这种方法,效果③(单独按空格仍然是空格)不知道怎么办

第二种:一条一条的写

Space:: SendInput, {Space}

Space & 1:: SendInput, +1

……

Space & 0:: SendInput, +0

Space & LButton:: SendInput, +{LButton}

Space & RButton:: SendInput, +{RButton}

Space & a:: SendInput, +a

……

但这种写法,效果②就是 框选怎么写呢?

求助大家

自定义组合键及其他特性

通过在两个按键 (不包括操纵杆按钮) 间使用 “&” 可以定义定制的组合键. 在下面的例子中, 您在按住 Numpad0 接着按下第二个按键时会触发此热键:

Numpad0 & Numpad1::MsgBox You pressed Numpad1 while holding down Numpad0.
Numpad0 & Numpad2::Run Notepad

在上面的例子中, Numpad0 成为 前缀键; 但是这也让 Numpad0 在被按下时失去了它原有的功能. 为了避免此问题, 脚本中可以配置 Numpad0 执行新的动作, 例如下列热键的其中一个:

Numpad0::WinMaximize A   ; 最大化活动/前端窗口.
Numpad0::Send {Numpad0}  ; 让 Numpad0 释放 时产生 Numpad0 键击. 请参阅下面的注释.

使用上面的其中一个自定义组合热键可以在释放Numpad0时执行指定的动作,但仅在您之前按住Numpad0时没有按其他任何按键的情况下。在v1.1.14+中,可以在其中某个热键使用颚化符前缀来避免这种行为。


*

通配符: 即使附加的修饰键被按住也能激发热键. 这常与 重映射 按键或按钮组合使用. 例如:

*#c::Run Calc.exe  ; Win+C、Shift+Win+C、Ctrl+Win+C 等都会触发此热键。
*ScrollLock::Run Notepad  ; 即使在按住其他修饰键时按下 ScrollLock 也会触发此热键。

~

激发热键时,不会屏蔽(被操作系统隐藏)热键中按键原有的功能。在下面的两个例子中, 用户的鼠标按钮点击会被发送到活动窗口:

~RButton::MsgBox You clicked the right mouse button.
~RButton & C::MsgBox You pressed C while holding down the right mouse button.

注意:1) 与其他前缀符号不同,可以在某些热键的变体中使用颚化符前缀而其他的不使用;2) 代替 alt-tab 的特殊热键总是忽略颚化符前缀。

[v1.1.14+]:如果把颚化符前缀用在自定义修饰键中且此修饰键自身也作为热键,则在按下此修饰键时会触发热键而不会被延迟到按键释放的时候。例如,上文中~RButton热键在按下此按键时就会触发。对于v1.1.14之前的版本(或未使用颚化符前缀), 则会在按键释放时触发其自身的热键,不过仅在未触发RButton & C组合键的时候。

$

通常只在脚本使用 Send 命令发送包含了热键自身的按键时才需要使用此符号, 此时可以避免触发它自己. 前缀强制使用 键盘钩子 来实现此热键, 作为一个副作用这样避免了 Send 命令触发它自己. 前缀相当于在此热键定义之前的某个位置指定了 #UseHook。

[v1.1.06+]: #InputLevel 和 SendLevel 对 Send 命令是否触发热键和热字串提供了额外的控制功能.


以上均摘自 AHK 官方说明文档

;Shift+左键单击
Space & LButton UP:: SendInput, +{LButton}

;Shift+左键框选(按下)
Space & LButton:: SendInput, +{LButton Down}

已解决。框选只靠allor那一行是不够的,空格和鼠标抬起时,仍然没lbutton up

Space::Shift 
Space Up:: 
    SendInput {Shift Up} 
    if (A_PriorKey = "Space" and GetKeyState("Ctrl") = 0 and GetKeyState("Shift") = 0 and GetKeyState("Alt") = 0) 
    { 
        if (sLButtonClicked = 1) 
        { 
            sLButtonClicked = 0 
        } 
        else 
        { 
            SendInput {Shift}{Space} 
        } 
    } 
    Return 
*~LButton:: 
    if (GetKeyState("Shift") = 1) 
    { 
        sLButtonClicked = 1 
    } 
    Return

2 个赞

其实看到你的问题的时候我就在想有没有硬件解决方案,然后发现了新大陆,事实上现在有大量可编程机械键盘,并且很多是开源的。下面这个不但可以实现你的需求,甚至拥有多达32层的键盘布局。https://ergodox-ez.com/

请教一下改成win键怎么改?
空格 +a/b/…/z/1/2/…/0,映射成 win +a/b/…/z/1/2/…/0
单独按 空格,就还是空

专业,直接我把我看晕了,不过我最近在研究AHK的应用,一个是runany,可以组合并击实现快捷功能,我都想借一点代码来改造现在用的capslock+了,还有个是输入法自动切换,用来实现代码中中英文混输的,还有最直接的并击输入法,这些都涉及到了类似的问题。我准备好好思考,实现一个全新的效率工具。

2 个赞