处理来自低级键盘挂钩的击键

时间:2019-11-18 15:03:01

标签: c# sendkeys keystroke keyboard-hook intptr

我正在使用低级键盘钩子,该钩子是从以下代码派生的:

Low-Level Keyboard Hook in C#

应用程序查找指示条形码的特定序列。我们利用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)
  1. 我的理论认为这是“流氓”回报的根源吗?
  2. 我该如何处理?我想知道是否可以在case语句中封送IntPtr值,但是我不确定如何解决这个问题。

我已经为此苦苦挣扎了一段时间,而且我不确定如何解决代码中剩下的一个问题。

0 个答案:

没有答案
相关问题