如何使 Rctrl & a 快捷键组合按下时,不会激活 Send, #{Space}

#HotkeyModifierTimeout 0

*Rctrl::return ; 禁止单独按下 RCtrl 时触发

Rctrl::  
Send, #{Space}
        SoundBeep, 300, 5
return
;ΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞ  切换中英输入法   Rctrl  ΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞ 4-75

以下为SnoMouse.ahk脚本中的一部分

#HotkeyModifierTimeout 0
;*Rctrl::return  ; 禁止单独按下 RCtrl 时触发
; 鼠标运动处理
*>^a:: 鼠标模拟.左按("a")
*>^d:: 鼠标模拟.右按("d")
*>^w:: 鼠标模拟.上按("w")               ; * 号可以避免和系统自带的Alt+w冲突,造成上移时关闭文档。
*>^s:: 鼠标模拟.下按("s")

完整的 SnoMouse.ahk

;#notrayicon
#Persistent
#SingleInstance force
#NoEnv 
#HotkeyModifierTimeout  0  ;影响热键修饰符的行为:CTRL、ALT、WIN 和 SHIFT。设为 0 时则总是超时 (修饰键总是不会被推回到按下的状态).
SetWorkingDir, %A_ScriptDir%
Process,priority, , high ;脚本进程优先级为高
#Include, D:\ahk1.0\Lib\AccModel.ahk            ;-------------------------------------------
Menu, Tray, Icon, D:\ahk1.0\Lib\0\Symbol purpel.ico 
global CapsLockXMode := 1
global TMouse_Disabled := 0
global TMouse_SendInput := 1
global TMouse_SendInputAPI := 1
global TMouse_SendInputScroll := 0
global TMouse_StickyCursor := 1
global TMouse_StopAtScreenEdge := 1
; 根据屏幕 DPI 比率,自动计算,得出,如果数值不对,才需要纠正
global TMouse_UseDPIRatio           := 1
global TMouse_MouseSpeedRatio       := 1   ;可调小
global TMouse_WheelSpeedRatio       := 1  ;可调小
global TMouse_DPIRatio              := TMouse_UseDPIRatio ? A_ScreenDPI / 96 : 1
global CapsLockX_WASD_MouseOrScroll := 1
; global debug_fps := new FPS_Debugger()
global 鼠标模拟 := new AccModel2D(Func("鼠标模拟"), 0.1, TMouse_DPIRatio * 120 * 2 * TMouse_MouseSpeedRatio)
global 滚轮模拟 := new AccModel2D(Func("滚轮模拟"), 0.1, TMouse_DPIRatio * 120 * 4 * TMouse_WheelSpeedRatio)
global 滚轮自动控制 := new AccModel2D(Func("滚轮自动控制"), 0.1, 10)
global 滚轮自动 := new AccModel2D(Func("滚轮自动"), 0, 1)

if (TMouse_SendInput) {
    SendMode Input   ;切换模式
}
; 解决多屏 DPI 问题
DllCall("Shcore.dll\SetProcessDpiAwareness", "UInt", 2)

; gestures supports
; [[AHK_H+Hv2] - WinApi() - Page 2 - Scripts and Functions - AutoHotkey Community]( https://www.autohotkey.com/board/topic/51243-ahk-hhv2-winapi/page-2 )
global WM_GESTURE:=281
global WM_GESTURENOTIFY:=282
global GID_BEGIN:=1
global GID_END:=2
global GID_ZOOM:=3
global GID_PAN:=4
global GID_ROTATE:=5
global GID_TWOFINGERTAP:=6
global GID_PRESSANDTAP:=7

CursorHandleGet()
{
    VarSetCapacity(PCURSORINFO, 20, 0) ;为鼠标信息 结构 设置出20字节空间
    NumPut(20, PCURSORINFO, 0, "UInt") ;*声明出 结构 的大小cbSize = 20字节
    DllCall("GetCursorInfo", "Ptr", &PCURSORINFO) ;获取 结构-光标信息
    if (NumGet(PCURSORINFO, 4, "UInt") == 0 ) ;当光标隐藏时,直接输出特征码为0
    Return 0
    Return NumGet(PCURSORINFO, 8)
}

CursorShapeChangedQ()
{
    static lA_Cursor := CursorHandleGet()
    if (lA_Cursor == CursorHandleGet()) {
        Return 0
    }
    lA_Cursor := CursorHandleGet()
    Return 1
}

sign(v)
{
    Return v == 0 ? 0 : (v > 0 ? 1 : -1)
}

Pos2Long(x, y)
{
    Return x | (y << 16)
}

SendInput_MouseMsg32(dwFlag, mouseData := 0)
{
    VarSetCapacity(sendData, 28, 0)
    NumPut(0, sendData, 0, "UInt")
    NumPut(0, sendData, 4, "Int")
    NumPut(0, sendData, 8, "Int")
    NumPut(mouseData, sendData, 12, "UInt")
    NumPut(dwFlag, sendData, 16, "UInt")
    DllCall("SendInput", "UInt", 1, "Str", sendData, "UInt", 28)
}
PostMessage_ScrollMouse(dx, dy)
{
    WM_MOUSEWHEEL := 0x020A
    WM_MOUSEWHEELH := 0x020E
    _:= dy && PostMessageForScroll(WM_MOUSEWHEEL, -dy)
    _:= dx && PostMessageForScroll(WM_MOUSEWHEELH, dx)
}
ScrollMouse(dx, dy)
{
    global TMouse_SendInputScroll
    if (TMouse_SendInputScroll) {
        SendInput_ScrollMouse(dx, dy)
    } else {
        PostMessage_ScrollMouse(dx, dy)
    }
}
SendInput_ScrollMouse(dx, dy)
{
    ; get cursor pos
    VarSetCapacity(POINT, 8, 0)
    DllCall("GetCursorPos", "Ptr", &POINT)
    x := NumGet(POINT, 0, "Int")
    y := NumGet(POINT, 4, "Int")
    ; scroll by system input message
    MOUSEEVENTF_WHEEL := 0x0800
    MOUSEEVENTF_HWHEEL := 0x1000
    if (dy) {
        size := A_PtrSize+4*4+A_PtrSize*2
        VarSetCapacity(mi, size, 0)
        NumPut(x, mi, A_PtrSize, "Int")   ; LONG dx
        NumPut(y, mi, A_PtrSize+4, "Int")  ; LONG dy
        NumPut(-dy, mi, A_PtrSize+4+4, "Int")  ; DWORD mouseData
        NumPut(MOUSEEVENTF_WHEEL, mi, A_PtrSize+4+4+4, "UInt")   ; DWORD dwFlags
        DllCall("SendInput", "UInt", 1, "Ptr", &mi, "Int", size )
        ; perf_timing()
    }
    if (dx) {
        ; todo fix sendinput
        PostMessage_ScrollMouse(dx, 0)

    }
}

SendInput_MouseMove(x, y)
{

    size := A_PtrSize+4*4+A_PtrSize*2
    VarSetCapacity(mi, size, 0)
    NumPut(x, mi, A_PtrSize, "Int")   ; int dx
    NumPut(y, mi, A_PtrSize+4, "Int")  ; int dy
    NumPut(0x0001, mi, A_PtrSize+4+4+4, "UInt")   ; DWORD dwFlags MOUSEEVENTF_MOVE
    DllCall("SendInput", "UInt", 1, "Ptr", &mi, "Int", size )
}
鼠标模拟2(dx, dy){
    SendInput_MouseMove(dx, dy)
    
}
ScrollModeToggle()
{
    global CapsLockX_WASD_MouseOrScroll
    if (CapsLockX_WASD_MouseOrScroll != 0) {
        CapsLockX_WASD_MouseOrScroll := 0
        ToolTip 鼠标模拟 已切换到 WASD 滚轮模式,再次按 CapsLockX+AD 可取消
        SetTimer 鼠标模拟_ToolTipRemove, -3000
    } else {
        CapsLockX_WASD_MouseOrScroll := 1
        ToolTip 鼠标模拟 已切换到 WASD 鼠标模式
        SetTimer 鼠标模拟_ToolTipRemove, -3000
    }
}
ScrollModeEnter()
{
    global CapsLockX_WASD_MouseOrScroll
    if (CapsLockX_WASD_MouseOrScroll != 0) {
        CapsLockX_WASD_MouseOrScroll := 0
        ToolTip 鼠标模拟 已切换到 WASD 滚轮模式,再次按 CapsLockX+AD 可取消
        SetTimer 鼠标模拟_ToolTipRemove, -3000
    }
}
ScrollModeExit()
{
    global CapsLockX_WASD_MouseOrScroll
    if (CapsLockX_WASD_MouseOrScroll != 1) {
        CapsLockX_WASD_MouseOrScroll := 1
        ToolTip 鼠标模拟 已切换到 WASD 鼠标模式
        SetTimer 鼠标模拟_ToolTipRemove, -3000
    }
}

; void 鼠标模拟
鼠标模拟(dx, dy, 状态){
    if (!CapsLockXMode) {
        鼠标模拟.止动()
        return
    }
    if (状态 == "横中键") {
        ScrollModeToggle()
        鼠标模拟.止动()
        return
    }
    if (状态 == "纵中键") {
        ScrollModeToggle()
        鼠标模拟.止动()
        return
    }
    if (状态 != "移动") {
        return
    }
    ; Shift 减速 =1
    if (GetKeyState("Shift", "P")) {
        sleep 100
        dx := dx == 0 ?  0 : (dx > 0 ? 1 : -1 )
        dy := dy == 0 ?  0 : (dy > 0 ? 1 : -1 )
    }
    if (TMouse_SendInputAPI) {
        ; 支持64位AHK!
        SendInput_MouseMove(dx, dy)
    } else {
        MouseMove, %dx%, %dy%, 0, R
    }
    
    ; TODO: 撞到屏幕边角就停下来
    ; if(TMouse_StopAtScreenEdge )
    ; MouseGetPos, xb, yb
    ; 鼠标模拟.横速 *= dx && xa == xb ? 0 : 1
    ; 鼠标模拟.纵速 *= dy && ya == yb ? 0 : 1
    
    
    ; 在各种按钮上减速,进出按钮时减速80%
    if (TMouse_StickyCursor && CursorShapeChangedQ()) {
        鼠标模拟.横速 *= 0.2
        鼠标模拟.纵速 *= 0.2
    }
}

滚轮自动(dx, dy, 状态){
    if (状态 != "移动") {
        return
    }
    ScrollMouse(dx, dy)
}
滚轮自动控制(dx, dy, 状态){
    if (状态 != "移动") {
        return
    }
    滚轮自动.横速 += dx, 滚轮自动.纵速 += dy, 滚轮自动.始动()
    msg := "【雪星滚轮自动v2】`n"
    msg .= "横:" (滚轮自动.横速|0) "px/s`n纵:" (滚轮自动.纵速|0)  "px/s`n"
    msg .= "CapsLockX + Ctrl + Alt + RF 调整纵向自动滚轮`n"
    msg .= "CapsLockX + Ctrl + Alt + Shift + RF 调整横向自动滚轮`n"
    鼠标模拟_ToolTip(msg)
}
滚轮模拟(dx, dy, 状态){
    if (!CapsLockXMode) {
        return 滚轮模拟.止动()
    }
    if ( 状态 == "横中键" || 状态 == "纵中键") {
        ScrollModeExit()
        
        SendEvent {Blind}{MButton Down}
        KeyWait r
        KeyWait f
        SendEvent {Blind}{MButton Up}
        ; 关闭滚轮自动
        if (滚轮自动.横速 || 滚轮自动.纵速) {
            滚轮自动.止动()
            滚轮自动控制(0, 0, "止动")
        }
        return
    }
    if (状态 != "移动") {
        return
    }
    ScrollMouse(dx, dy)
}
PostMessageForScroll(msg, zDelta)
{
    ; 目前还不支持 UWP which should use WM_TOUCH
    CoordMode, Mouse, Screen
    MouseGetPos, x, y, wid, fcontrol
    wParam := zDelta << 16 ;zDelta
    lParam := x | (y << 16) ; pos2long
    MouseGetPos, , , , ControlClass2, 2
    MouseGetPos, , , , , ControlClass3, 3
    if (A_Is64bitOS) {
        ControlClass1 := DllCall("WindowFromPoint", "int64", x | (y << 32), "Ptr") | 0x0
    } else {
        ControlClass1 := DllCall("WindowFromPoint", "int", x, "int", y) | 0x0
    }
    ;Detect modifer keys held down (only Shift and Control work)
    wParam |= GetKeyState("Shift", "p") ? 0x4 : 0
    wParam |= GetKeyState("Ctrl", "p")  ? 0x8 : 0
    if (ControlClass2 == "") {
        ; PostMessage, %msg%, %wParam%, %lParam%, %fcontrol%, ahk_id %ControlClass1%
        DllCall("PostMessage", "UInt", ControlClass1, "UInt", msg, "UInt", wParam, "UInt", lParam, "UInt")
    } else {
        ; PostMessage, %msg%, %wParam%, %lParam%, %fcontrol%, ahk_id %ControlClass2%
        DllCall("PostMessage", "UInt", ControlClass2, "UInt", msg, "UInt", wParam, "UInt", lParam, "UInt")
        if (ControlClass2 != ControlClass3) {
            ; PostMessage, %msg%, %wParam%, %lParam%, %fcontrol%, ahk_id %ControlClass3%
            DllCall("PostMessage", "UInt", ControlClass3, "UInt", msg, "UInt", wParam, "UInt", lParam, "UInt")
        }
    }
    if (wid) {
        DllCall("PostMessage", "UInt", wid, "UInt", msg, "UInt", wParam, "UInt", lParam, "UInt")
    }
    ; tooltip % x " " y "`n" ControlClass1  "`n"  ControlClass2 "`n" ControlClass3 "`n" wid
}

CapsLockX_鼠标左键按下(wait){
    ScrollModeExit()
    global CapsLockX_鼠标左键等待
    if (CapsLockX_鼠标左键等待) {
        return
    }
    CapsLockX_鼠标左键等待 := wait
    SendEvent {Blind}{LButton Down}
    KeyWait %wait%
    ; Hotkey, %wait% Up, CapsLockX_鼠标左键弹起
}
CapsLockX_鼠标左键弹起(){
    global CapsLockX_鼠标左键等待
    SendEvent {Blind}{LButton Up}
    CapsLockX_鼠标左键等待 := ""
    
}
CapsLockX_鼠标右键按下(wait){
    ScrollModeExit()
    global CapsLockX_鼠标右键等待
    if (CapsLockX_鼠标右键等待) {
        return
    }
    CapsLockX_鼠标右键等待 := wait
    SendEvent {Blind}{RButton Down}
    KeyWait %wait%
    ; Hotkey, %wait% Up, CapsLockX_鼠标右键弹起
}
CapsLockX_鼠标右键弹起(){
    global CapsLockX_鼠标右键等待
    SendEvent {Blind}{RButton Up}
    CapsLockX_鼠标右键等待 := ""
}
鼠标模拟_ToolTip(tips){
    ToolTip %tips%
    SetTimer 鼠标模拟_ToolTipRemove, -3000
}
鼠标模拟_ToolTipRemove(){
    ToolTip
}



#if CapsLockXMode && CapsLockX_MouseButtonSwitched
/*
; 鼠标按键处理
>^e:: CapsLockX_鼠标右键按下("e")
>^q:: CapsLockX_鼠标左键按下("q")
>^e Up::CapsLockX_鼠标右键弹起()
>^q Up:: CapsLockX_鼠标左键弹起()
*/
#if CapsLockXMode
*Rctrl::return  ; 禁止单独按下 RCtrl 时触发
; 鼠标运动处理
*>^a:: 鼠标模拟.左按("a")
*>^d:: 鼠标模拟.右按("d")
*>^w:: 鼠标模拟.上按("w")               ; * 号可以避免和系统自带的Alt+w冲突,造成上移时关闭文档。
*>^s:: 鼠标模拟.下按("s")

#if CapsLockXMode
*>^q::
    ScrollModeExit()
    滚轮模拟.上按("q")
return
*>^e::
    ScrollModeExit()
    滚轮模拟.下按("e")
return
;-----------------------------------------------模拟鼠标操作 WASD 鼠标移动,Q E 滚轮
#if CapsLockXMode

*>^g::                         ; 需连接2次g   
	SendEvent {click}{LButton down} 
	KeyWait, LButton                                                            
	return

; 🛏🛏🛏🛏🛏🛏🛏🛏🛏🛏  >^g 需连接2次g   左键按住   松开左键   🛏🛏🛏🛏🛏🛏🛏🛏🛏🛏🛏

z::
SendEvent {Blind}{RButton down}        
KeyWait Lwin
global SendEvent {Blind}{RButton up}
return

x::
SendEvent {Blind}{LButton down}          ;注意此处为LButton(鼠标左右换了)
KeyWait Rwin
global SendEvent {Blind}{LButton up}
return
; ΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞ  >^z 左键  >^x  右键   ΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞ 3

c::
Send {RButton down}
return
v::
SendEvent {click}
return
	KeyWait, RButton
	return
; ΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞ   c 左键按住   v 松开左键     ΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞ 4
#if CapsLockXMode
; ΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞ
;⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇠⇢⇢ 
#Persistent
SetTimer, Alert9, 500
WindowList:=[]
return
 
Alert9:
	Value := WindowList.Pop()
	if (Value=WinExist("A"))
	{
		WindowList.push(WinExist("A"))
	}
	else
	{
		if (value!="")
			WindowList.push(Value)
		WindowList.push(WinExist("A"))
	}
return
; ΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞΞ

转载请注明出处