As chaves ficam presas - bug nos drivers de teclado?

6

Eu trabalho como programador e escrevo bem rápido (embora não seja super rápido). No meu trabalho, o laptop da Dell, muitas vezes eu me deparo com dois bugs, que eu suspeito que tenha a ver com algum driver de teclado do Windows subjacente ("subjacente", já que os bugs ocorrem em uma marca totalmente diferente de teclado também). Não é uma propriedade física do teclado, eu tentei substituir o teclado em si. Ambos teclado USB, btw.

Estes são os problemas estranhos:

  • A tecla Ctrl trava quando eu digito rápido - mas ele não trava não fisicamente - o "código da chave de liberação" nunca chega ao sistema operacional, parece que sim. Isso acontece com frequência, digamos, a cada 20 a 120 segundos, quando estou na zona. A maneira de resolvê-lo é 1) perceber que a tecla de controle é considerada pressionada pelo sistema e 2) pressionar e soltar a tecla direita Ctrl . A tecla esquerda Ctrl não corrige o erro (eu sei que eles enviam códigos de verificação diferentes).

  • A tecla Shift "trava" da mesma maneira, mas não há como desbloqueá-la pressionando e soltando a tecla Shift, parece haver um contador interno que trava . Isso acontece talvez a cada 10 a 20 dias. Para resolver eu 1) tenho que perceber que a tecla Shift está em um estado pressionado (é impossível trabalhar com a tecla Shift pressionada, simplesmente selecionando outro arquivo no Explorer.exe torna-se impossível, para não mencionar a tentativa de escrever código no Eclipse) e para corrigi-lo eu 2) executar um script que escrevi para AutoHotkey, que envia {SHIFT UP} para o sistema. Antes de escrever o script, tive que reiniciar o computador ...

Estou ficando irritado com isso. O que causa isso e como posso resolver esses problemas?

Editar: aqui está meu arquivo 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
    
por Jonas Byström 24.05.2012 / 21:24

1 resposta

2

  • Tecla Ctrl :

    Eu assumo que a linha

    Capslock::Ctrl
    

    foi não comentado quando você teve problemas com a tecla Ctrl .

    Diferentes teclados e seus drivers se comportam de maneira diferente. Alguns não se registram quando CapsLock é liberado, já que geralmente não faz nada.

    Nos meus dois teclados, pressionar e liberar CapsLock envia {LCtrlDown} em um e {RCtrlDown} no outro, mas nunca {CtrlUp} . Pressionando e soltando o respectivo Ctrl (mas não o oposto), corrige isso.

    Além de comentar a linha, não consigo pensar em solução para isso.

  • Tecla

    Shift :

    Consegui reproduzir o comportamento que você explicou uma vez , mas não sei como o fiz.

    No entanto, presumo que a linha

    RShift::LShift
    

    é o culpado.

    Eu não posso explicar como um {RShiftDown} pode ser enviado com a tecla Shift correta remapeada, mas certamente explica porque pressionar a tecla Shift corrige isso, já que liberando a tecla direita Shift enviará {LShiftUp} .

    Pode haver uma solução para isso além de comentar a linha, mas não tenho certeza do que você quer alcançar com ela.

por 31.05.2012 / 15:35