按键卡住 - 键盘驱动程序中的错误?

Jon*_*röm 6 windows usb-keyboard

我是一名程序员,写得非常快(虽然不是特别快)。在我工作的戴尔笔记本电脑中,我经常遇到两个错误,我怀疑这与一些底层的 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
Run Code Online (Sandbox Code Playgroud)

Den*_*nis 2

  • Ctrl钥匙:

    我假设该行

    Capslock::Ctrl
    
    Run Code Online (Sandbox Code Playgroud)

    当您遇到密钥问题时,不会被注释掉Ctrl

    不同的键盘及其驱动程序的行为不同。CapsLock有些在发布时不会注册,因为它通常什么也不做。

    在我的两个键盘上,按下并释放会在一个和另一个上CapsLock发送,但从来没有。按下并释放相应的(但不是相反的)可以解决此问题。{LCtrlDown}{RCtrlDown}{CtrlUp}Ctrl

    除了注释掉该行之外,我想不出解决方案。

  • Shift钥匙:

    我设法重现了您曾经解释过的行为,但我不知道我是如何做到的。

    但是,我假设该行

    RShift::LShift
    
    Run Code Online (Sandbox Code Playgroud)

    是罪魁祸首。

    我无法解释如何在重新映射{RShiftDown}右键的情况下发送a Shift,但它确实解释了为什么按两个Shift键都无法解决此问题,因为释放右键Shift将发送{LShiftUp}.

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