我正在使用低级键盘钩子,该钩子是从以下代码派生的:
应用程序查找指示条形码的特定序列。我们利用3种不同的系统使用条形码扫描仪,每个系统都要求扫描仪使用不同的输出格式。该应用程序的目的是监视正在使用的程序,并将输出格式化为聚焦应用程序所需的格式,然后使用sendkey将其发送到程序。
条形码为Code-128;更具体地说,是GS1-128格式(也是GS1-Datamatrix)。该代码查找“] C1”或“] d2”以启动条形码。我们通过在输出的末尾附加一个“ enter”来结束扫描。
程序将查找先前记录的条形码的开始顺序,并在检测到条形码时通过返回(IntPtr)1开始吃文本。它将文本存储到变量中,并继续添加新文本,直到检测到确定条形码结尾的Enter键。一旦拾取了条形码的末尾,它将应用正确的格式并使用sendkeys语句将正确格式的文本发送到打开的程序。
代码中的所有内容似乎都可以按需工作,除了在sendkeys输出中得到流氓返回之外。我以前曾发布过此问题的概述问题,但我相信我对现在发生的事情有了更好的了解:
Rogue return appearing 9 characters into sendtext
我目前正在监视输入,因为它已被钩住,但我看不到“恶意”返回在与输出匹配的预期位置通过(非法返回通常显示在输出中,通常为8或9个字符,但在控制台输出中的相同字符之间未显示该“输入”键。我认为,退货原因不明,实际上是封闭条形码的退货,因为在启动sendkey之前尚未对其进行处理。
由于此程序基于文本输入循环,因此我无法在拾起Enter键后立即简单地返回(IntPtr)1。我目前以这种方式来处理它,我认为这从根本上来说是有缺陷的,因为它在启动sendkeys语句之前不处理最后的击键:
// format data for applicable program
if (windowType != WindowTypes.WindowA) {
switch (windowType) {
case WindowTypes.WindowX:
string xText = Globals.barcodeDataString;
SendKeys.Send(FormatForX(xText));
break;
case WindowTypes.WindowY:
string yText = FormatForY(Globals.barcodeDataString);
SendKeys.Send(yText);
break;
}
Globals.sendKeysActive = false;
Globals.barcodeDataString = "";
}
return (IntPtr)1; // This is where I 'eat' the last enter key (currently after the sendkeys is sent)
我已经为此苦苦挣扎了一段时间,而且我不确定如何解决代码中剩下的一个问题。