粘滞键激活(移动5次)不能通过热键发送::发送{LShift 5}

时间:2012-10-12 17:43:28

标签: accessibility autohotkey hotkeys

我想通过按1按钮来激活粘滞键,而不是按下shift 5次,这是默认方式。

如果我要做的话

F9::Send {LShift 5}

按F9将不会产生任何效果。

我也试过

F9::
Send {LShift}
sleep 50
Send {LShift}
sleep 50
Send {LShift}
sleep 50
Send {LShift}
sleep 50
Send {LShift}
sleep 50
return

有什么原因导致它无效吗?

2 个答案:

答案 0 :(得分:0)

虽然很可能有办法进行dll调用或复杂的事情,但也可能使用AutoHotkey编写类似的功能。这也可以避免粘滞键提示,你可以改为托盘提示。

stickykeys = 0

F9::
    stickykeys:=!stickykeys
    Traytip, Sticky Keys, % (stickykeys) ? "On" : "Off"
    return

#If stickykeys

    *$Shift::
        key = 0
        Input, key, L1 M
        SendInput {Shift Down}{%key%}{Shift Up}
    return

    *$Ctrl::
        key = 0
        Input, key, L1 M
        SendInput {Ctrl Down}{%key%}{Ctrl Up}
    Return

    *$Alt::
        key = 0
        Input, key, L1 M
        SendInput {Alt Down}{%key%}{Alt Up}
    Return
#If

F9只需打开和关闭粘滞键即可。

注意:这是使用支持#If

的AHK_L

答案 1 :(得分:0)

SPI_GETSTICKYKEYS:=0x003A
SPI_SETSTICKYKEYS:=0x003B
SKF_STICKYKEYSON:=0x1

VarSetCapacity(STICKYKEYS,8) ; DWORD cbSize;DWORD dwFlags;
NumPut(8,&STICKYKEYS,"UInt")
F9::
  DllCall("SystemParametersInfo","UInt",SPI_GETSTICKYKEYS,"UInt",8,"PTR",&STICKYKEYS,"UInt",0)
  dwFlags:=NumGet(&STICKYKEYS,4,"Uint")
  If (dwFlags & SKF_STICKYKEYSON)
    dwFlags-=SKF_STICKYKEYSON
  else dwFlags|=SKF_STICKYKEYSON
  ToolTip % "STICKYKEYS are " (dwFlags & SKF_STICKYKEYSON ? "ON" : "OFF")
  SetTimer,ToolTipOff,-1000
  NumPut(dwFlags,&STICKYKEYS,4,"UInt")
  DllCall("SystemParametersInfo","UInt",SPI_SETSTICKYKEYS,"UInt",8,"PTR",&STICKYKEYS,"UInt",0)
Return
ToolTipOff:

代码来自http://www.autohotkey.com/community/viewtopic.php?f=1&t=93650

的Autohotkey论坛

任何想要使用代码的人的注释:我认为你必须将它放在脚本的顶部才能使用它。在我的热键脚本中,将它放在中间,然后按F9激活粘性键会导致一些奇怪的事情发生:光标跳转,一些文件夹被启动,脚本退出等等。我猜它激活了其他附近有热键?