按键卡住——键盘驱动程序有缺陷?

按键卡住——键盘驱动程序有缺陷?

我是一名程序员,写得很快(虽然不是超级快)。在我的工作戴尔笔记本电脑中,我经常遇到两个错误,我怀疑这与某些底层 Windows 键盘驱动程序有关(“底层”,因为这些错误也发生在完全不同品牌的键盘上)。这不是键盘的物理属性,我试过更换键盘本身。顺便说一下,两个都是 USB 键盘。

以下是一些奇怪的问题:

  • 当我快速打字时,按键Ctrl会挂起 - 但这不是物理挂起 - “释放键代码”似乎从未到达操作系统。这种情况经常发生,比如说,当我处于专注状态时,每 20 到 120 秒就会发生一次。解决此问题的方法是 1) 意识到系统认为控制键已按下,2) 按下并释放正确的 Ctrl键。左键Ctrl不能修复错误(我知道它们发送不同的扫描码)。

  • Shift键以相同的方式“挂起”,但无法通过按下并释放 Shift 键将其解锁,似乎有一个内部计数器挂起。这种情况可能每 10 到 20 天发生一次。要解决这个问题,我必须 1) 意识到该 Shift键处于按下状态( Shift按下该键时无法工作,在 Explorer.exe 中选择另一个文件变得不可能,更不用说尝试在 Eclipse 中编写代码了)并修复它 2) 运行我为 AutoHotkey 编写的脚本,该脚本发送{SHIFT UP}到系统。在我编写脚本之前,我必须重新启动计算机...

我对此感到很恼火。这是什么原因造成的?我该如何解决这些问题?

编辑:这是我的 AHK 文件:

RShift::LShift

^!+r::
  ; Show a black "splash" to reveal script reloading.
  Run %windir%\system32\cmd.exe /c
  Reload
return

^!+e::
  Edit
return

; Send shift-up.
#^!+s::
  ; Send shift-up to "fix" my office laptop bug.
  SendInput {Shift Up}
return

; -------------------------

!+a::
  Run C:\Program Files\Notepad++\notepad++.exe
return

^!+a::
  Run %windir%\system32\notepad.exe
return

^!+d::
  Run %programfiles%\git\bin\bash.exe, c:\RnD\PD\trunk
return

RunExplorer(root, startTitle, subpath, endTitle, filename)
{
  SetTitleMatchMode, 3
  IfWinExist, %endTitle%
  {
    WinActivate,%endTitle%
    return
  }
  else
  {
    var = /e,
    if (root != "")
    {
      var = /e,/root,%root%
    }
    Run "%windir%\explorer.exe" %var%
    WinWait,%startTitle%,,4
  }
  if (ErrorLevel == 0)
  {
    #WinActivateForce
    WinActivate,%startTitle%
    WinWaitActive,%startTitle%,,10
    if (subpath != "")
    {
      SendInput {LAlt Down}d{LAlt Up}{End}%subpath%{ENTER}{Tab}{Tab}
    }
    SendInput {Tab}%filename%
  }
}

;Opens project home folder.
#e::
  RunExplorer("C:\RnD", "RnD", "\protustom\trunk\implementation\Protom", "Protom", "ProtomDC")
return

;Opens My docs folder.
#m::
  RunExplorer("H:\", "V0c1573 on 'Vcn.ds.volvo.net\It-got\Home07' (H:)", "My Documents", "My Documents", "Auto")
return

;Opens program files
#h::
  RunExplorer("C:\", "Local Disk (C:)", "Program Files", "Program Files", "7")
return

#k::
  Run %windir%\system32\Control.exe
return

#c::
  Run calc.exe
return

#r::
  Run regedit.exe
return

; Stores a screen shot as tmp.png on the desktop.
; Take screenshot manually before running this.
#q::
  Run c:\WINDOWS\system32\mspaint.exe
  WinWaitActive, namnlös - Paint,,15
  if (ErrorLevel == 0)
  {
    Send ^v ; Paste screenshot.
    Send !am ; Save as.
    Send +{Tab}+{Tab}{Down}{ENTER}{Tab}{Tab} ; Save to desktop folder.
    Send tmp{Tab}{Down}{End}{ENTER}{ENTER} ; Write tmp.png.
    WinWaitActive, Spara som,,2
    if (ErrorLevel == 0)
    {
      Sleep, 100 ; Wait a bit for dialog to load.
      Send {Left}{Enter} ; Overwrite previous file.
    }
    Send !{F4} ; Close paint.
  }
return


; Shift+CapsLock turns on/off CapsLock.
;Capslock::Ctrl
;+Capslock::Capslock

答案1

  • Ctrl钥匙:

    我假设

    Capslock::Ctrl
    

    曾是不是当您遇到Ctrl密钥问题时,请将其注释掉。

    CapsLock不同的键盘及其驱动程序的行为不同。有些在发布时不会注册,因为它通常不执行任何操作。

    在我的两个键盘上,按下和释放会分别向其中一个键盘CapsLock发送信息,但从不发送信息。按下和释放相应的键盘(而不是相反的键盘)可以解决这个问题。{LCtrlDown}{RCtrlDown}{CtrlUp}Ctrl

    除了注释掉这一行之外,我想不出解决办法。

  • Shift钥匙:

    我设法重现了你解释的行为一次,但我不知道我是怎么做到的。

    不过,我假设

    RShift::LShift
    

    是罪魁祸首。

    我无法解释如何{RShiftDown}通过重新映射右键来发送Shift,但它确实解释了为什么按下任何一个Shift键都无法解决这个问题,因为释放右键Shift将发送{LShiftUp}

    除了注释掉该行之外,可能还有其他解决方案,但我不太确定您想用它实现什么。

相关内容