C# 在windows环境中,将输入从类似键盘的设备重定向到后台进程

C# 在windows环境中,将输入从类似键盘的设备重定向到后台进程,c#,redirect,windows-7,keyboard,stdin,C#,Redirect,Windows 7,Keyboard,Stdin,我使用简单的RFID读卡器设备,该设备通过usb电缆连接到PC,并被识别为类似键盘的设备。 我想通过我的应用程序读取此设备的输入,但它正在后台运行,即其他应用程序处于焦点位置。 在windows 7环境中,如何将stdin重定向到我的应用程序? 我无法将焦点更改为我的应用程序 我无法在前端应用程序中进行更改(例如,捕获stdin并通过管道将其发送给我的应用程序等) 我的应用程序是用C编写的,但我可以将其重写为Java/C 电脑运行Win7操作系统 谢谢 y这里是我的解决方案: 我已通过USB将普

我使用简单的RFID读卡器设备,该设备通过usb电缆连接到PC,并被识别为类似键盘的设备。 我想通过我的应用程序读取此设备的输入,但它正在后台运行,即其他应用程序处于焦点位置。 在windows 7环境中,如何将stdin重定向到我的应用程序? 我无法将焦点更改为我的应用程序 我无法在前端应用程序中进行更改(例如,捕获stdin并通过管道将其发送给我的应用程序等) 我的应用程序是用C编写的,但我可以将其重写为Java/C 电脑运行Win7操作系统

谢谢 y

这里是我的解决方案:

我已通过USB将普通键盘读卡器连接到我的计算机。
两个设备都写入windows键盘缓冲区

我想将读卡器的输入重定向到另一个应用程序或文件,并将其从键盘缓冲区中删除(以便此输入不会显示在任何编辑器中)

我所知/先决条件:

  • 读卡器的输入仅包含十六进制字母(0-9,A-F),并由换行符完成
  • 读卡器输入将“在块上”接收,这意味着两个收到的字母之间只有几毫秒
  • 一个人不可能在70毫秒内输入两个或两个以上的数字(我已经试过了)
我所做的:

  • 我听着键盘缓冲区,取出每一个输入字母/键。任何不是0-9或A-F的输入都将立即放回键盘缓冲区
  • 如果出现输入0-9或a-F,我会将其存储在字符串缓冲区中(可能来自读卡器)
  • 如果超过70毫秒没有进一步的输入,并且缓冲区中至少有4个字节包含0-9或A-F,那么我假设/知道它来自读卡器,并以我自己的方式使用它。这些字节已从键盘缓冲区中取出
  • 如果我的缓冲区中只有一个/两个/三个字母0-9/A-F,则在70毫秒后,它们将被放回windows键盘缓冲区。当你打字的时候,你不会意识到“一些”字母对一个人来说有点延迟
这里是我的程序(用脚本语言编写): KeybRedir.ahk

; KeybRedir
; Programmiert von Michael Hutter - Mai 2018

#NoEnv ;Avoids checking empty variables to see if they are environment variables
#SingleInstance force
Process, Priority, , Normal
#Warn All

SaveKeyList=

0::
1::
2::
3::
4::
5::
6::
7::
8::
9::
+A::
+B::
+C::
+D::
+E::
+F::
Return::
{ ; If one of these characters was typed => take it out of windows key buffer...
    if A_ThisHotkey = Return
        Hotkey:=Chr(13)
    else
        Hotkey:=A_ThisHotkey
    SaveKeyList = %SaveKeyList%%Hotkey%
    SetTimer , DoKeyPlay, 70 ; Wait 70ms for another key press of charlist (re-trigger the timer in case it already runs)
}
return

DoKeyPlay:
    SetTimer , , Off
    SaveText:=RegExReplace(SaveKeyList, "\+", "")
    StringReplace, SaveText, SaveText, `r, , All
    if StrLen(SaveText) < 4 ; Accumulated text size < 4 letters => normal key input
    {
        SendPlay %SaveKeyList% ; put captured text back in windows key buffer
    }
    else ; Now we have the input of the card reader
    {
        SplashTextOn, , , %SaveText% ; Do something with the input or the card reader ...
    }
    SaveKeyList=
    SaveText=
    SetTimer , SplashOff, 2000
return

SplashOff:
    SplashTextOff
    SetTimer , , Off
return
;凯布雷迪尔
; 项目经理冯·迈克尔·赫特-2018年Mai
#诺恩夫;避免检查空变量以查看它们是否为环境变量
#单实例力
进程、优先级、正常
#警告所有人
保存键列表=
0::
1::
2::
三::
4::
5::
6::
7::
8::
9::
+A::
+B::
+C::
+D::
+E::
+F::
返回::
{;如果键入了其中一个字符=>请将其从windows密钥缓冲区中取出。。。
如果A_ThisHotkey=返回
热键:=Chr(13)
其他的
热键:=A_this热键
SaveKeyList=%SaveKeyList%%热键%
SetTimer,DoKeyPlay,70;等待70毫秒,等待charlist再次按键(如果计时器已经运行,则重新触发计时器)
}
返回
DoKeyPlay:
设定计时器,关闭
SaveText:=RegExReplace(SaveKeyList,\+,“”)
StringReplace、SaveText、SaveText、`r、All
如果StrLen(SaveText)<4;累计文本大小<4个字母=>正常按键输入
{
SendPlay%SaveKeyList%;将捕获的文本放回windows密钥缓冲区
}
其他的现在我们有了读卡器的输入
{
SplashTextOn,,%SaveText%;对输入或读卡器执行某些操作。。。
}
保存键列表=
保存文本=
设置计时器,飞溅,2000
返回
飞溅物:
溅落
设定计时器,关闭
返回
您可以使用.

将此脚本编译为exe文件(327KB)。我认为您要搜索的短语是“键盘挂钩”。