Guten Tag,
Ich habe eine mechanische Tastatur (MX-Brown Switches von Cherry), die immer wieder mehrfache Tastenanschläge erzeugt (bei bestimmten Tasten), obwohl die Taste nur einmal gedrückt wurde. Damit bin ich nicht der Einzige, solche Probleme sind häufiger anzutreffen (insbesondere bei mechanischen Tastaturen).
Um dieses Problem zu lösen und ohne eine neue Tastatur erwerben zu müssen, habe ich eine Software programmiert, die eine softwareseitige "entprellung" ermöglicht.
Hier der Sourcecode, ist eine Menge WinApi Kram, steigt wahrschenlich niemand durch (kommentiert habe ich da eher nicht)
#include <MsgBoxConstants.au3>
#include <StructureConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <TrayConstants.au3>
Opt("TrayMenuMode", 3)
Global $g_hHook, $g_hStub_KeyProc, $g_sBuffer = ""
Global $DelayTime = IniRead(@WorkingDir & "\Settings.ini", "Delay", "Time_ms", "5")
Global $Keys = IniRead(@WorkingDir & "\Settings.ini", "Used_Chars", "Chars", "")
Global $Auto = IniRead(@WorkingDir & "\Settings.ini", "Autostart", "Enable", "")
Global $pause = 0
if $DelayTime > 200 then $DelayTime = "200"
Main()
Func Main()
OnAutoItExitRegister("Cleanup")
Local $idExit = TrayCreateItem("Exit")
if $Auto = "yes" then
RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "Anti_Key_Bouncing", "REG_SZ", @ScriptFullPath)
Else
RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "Anti_Key_Bouncing")
EndIf
$g_hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
$g_hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($g_hStub_KeyProc), _WinAPI_GetModuleHandle(0))
While 1
If TrayGetMsg() = $idExit Then ExitLoop
WEnd
EndFunc
; callback function
Func _KeyProc($nCode, $wParam, $lParam)
If $nCode < 0 Then Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam)
Local $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
If $wParam = $WM_KEYUP Then
if (DllStructGetData($tKEYHOOKS, "vkCode") > 1) then
for $i = 1 to StringLen($Keys)
if DllStructGetData($tKEYHOOKS, "vkCode") = Asc(StringMid(StringUpper($Keys),$i,1)) then
AdlibRegister("Delay", $DelayTime)
$pause = 1
endif
Next
endif
EndIf
if $pause = 1 then
return 1
else
Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam)
endif
EndFunc ;==>_KeyProc
Func Cleanup()
_WinAPI_UnhookWindowsHookEx($g_hHook)
DllCallbackFree($g_hStub_KeyProc)
EndFunc ;==>Cleanup
Func Delay()
$pause = 0
AdlibUnRegister("Delay")
EndFunc
Alles anzeigen
(Verbesserungen wurden in den Code eingebaut 03-08-2016 - 02:39)
Dazu benötigt man eine "Settings.ini"
Erklärung der Settings:
[Time] - Time_ms = Entprell Zeit in Millisekunden
[Used_Chars] - Chars = Buchstaben die entprellt werden sollen
[Autostart] - Enable = yes für Autostart, irgendetwas anderes für keinen Autostart
Viel Spaß damit, falls ihr damit etwas anfangen könnt
MfG