11

环境

  • Windows XP x32 Visual Studio 2005 标准版
  • Honeywell Dolphin 9500 运行 Windows Mobile 2003 (Pocket PC 2003)
  • .NET Compact Framework 1.0 SP3 和 .NET Framework 1.1
  • 使用 VC#

目标

我正在尝试创建一个允许个人扫描条形码然后捕获图像的应用程序。这些事情不应该同时发生。用户应该能够仔细检查条形码扫描,然后移动到处理图像捕获的应用程序部分。


问题

行号在下面代码部分的friendpaste链接中引用了我的代码。

我有两个事件处理程序:一个用于来自条形码扫描仪控件的解码事件,另一个用于通过 KeyDown 事件调用图像捕获控件。解码控件有自己的事件/处理程序 DecodeEventHandler 和一个带有枚举(lns 201 和 202)的触发键集。然而,图像控件没有。它的文档指出表单应该有一个 KeyDown 事件处理程序(ln 120)和触发键枚举(ln 178)。在运行应用程序时(没有 SelectedIndexChanged [ln 76] 事件处理程序),条形码扫描器工作得很好,但切换到选项卡(或表单,因为我也尝试过单独的表单),图像捕获控制和按下设备上的触发键(在本例中为 SCAN)会导致手持设备的行为就像它仍在扫描条码一样(红灯亮起,显示绿色瞄准灯,


我尝试过的事情

  • 重要提示:如果我从应用程序中删除解码控件,图像控件将起作用。如果我只用图像控件构建一个单独的应用程序,它就可以工作。
  • 我在第 210 行设置了一个断点,发现 KeyDown 事件永远不会被击中。在这一点上,我尝试以某种方式分离事件处理程序或控件,因此我为我的选项卡控件引入了 SelectedIndexChanged 事件处理程序,并在切换到具有适当控件的选项卡时,我尝试删除事件处理程序。我能够删除 DecodeEvent 处理程序,但仍然无法点击我编写的 KeyDown 事件处理程序委托。
  • 霍尼韦尔 SDK 的解码和图像控件都有“断开连接”事件(引用文档)“与扫描引擎断开连接”。因此,我尝试根据切换到的选项卡断开和重新连接控件,但也没有成功。
  • 我还在某处读到,如果表单失去焦点,有时会中断表单事件。所以我实现了 Form.LostControl 事件/处理程序并放入 this.Focus() 以将焦点返回到表单但无济于事。
  • 我遇到过很多人建议 KeyPreview = true 并在表单级别处理/委托事件。.NET Compact Framework 版本 1 似乎没有实现这一点,因为我的 Form 对象没有 KeyPreview 成员。
  • 在 TriggerKey 枚举中(例如第 202 行),设备上的 Enter 键有一个枚举。我尝试将其连接到图像控件,然后扫描到解码器控件,但仍然无法触发 KeyDown 事件。

代码

http://friendpaste.com/355cQOCghvPkE5YR29lthO

我将代码发布为friendpaste 链接,因为它有点长(~230 行)。让我知道我是否应该把它包括在这里。


需要更多信息?

问一下,我会尽力而为!

我会标记这个 Honeywell Dolphin 9500,但我是新用户。

4

3 回答 3

1

我认为您无法访问KeyDown处理程序的原因是用于的处理程序是TabControl1_IndexChangeda System.EventHandler,它是KeyDown.

尝试做这样的事情,看看它是否正在捕捉KeyDown

private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
   if (sender is Form1 && e is KeyEventArgs)
   {
       Form1_KeyDown(sender,  (KeyEventArgs) e);
   }
   else
   {
       //Do other stuff
   }

}
于 2011-03-16T14:49:15.520 回答
1

这有点骇人听闻,但我认为它会起作用。设置AllKeys( true );。这应该确保您的应用程序捕获任何键盘按下。

AllKeys P/Invoke 签名:http: //blogs.msdn.com/b/mikefrancis/archive/2009/03/28/porting-gapi-keys-to-wm-6-1-and-6-5.aspx

一般 AllKeys 信息: http: //windowsteamblog.com/windows_phone/b/windowsphone/archive/2009/07/14/just-say-no-to-gapi-what-you-need-to-know-about-allkeys- and-input-management.aspx

听起来解码控件正在吞噬您需要的消息。您可以尝试联系 HHP 开发人员支持。如果他们有一个在线开发者支持论坛也可以。作为测试,如果您开始注释掉第 192-202 行会发生什么?这些行之一是否会导致您的 keydown 事件停止工作?

-保罗H

编辑

imageControl 和 decodeControl 都接受一个TriggerKey参数。听起来他们希望自己处理按键事件。

试试这个:一次只实例化其中一个,具体取决于您所在的选项卡。一起摆脱Form1_KeyDown处理代码(包括 AllKeys)。看看这是否有效。

或者,您仍然可以杀死您的Form1_KeyDown处理程序,但保持两个控件原样,并在您的tabControl1_SelectedIndexChanged处理程序中执行此操作:

private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (this.tabControl1.SelectedIndex == 0)
    {
        this.decodeControl1.TriggerKey = HHP.DataCollection.Common.TriggerKeyEnum.TK_ONSCAN;
        this.imageControl1.TriggerKey = null;
    }
    else if (this.tabControl1.SelectedIndex == 1)
    {
        this.decodeControl1.TriggerKey = null;
        this.imageControl1.TriggerKey = TriggerKeyEnum.TK_ONSCAN;
    }
}

现在,根据您所在的选项卡,只有其中一个会观看扫描按钮。

于 2011-03-16T15:35:11.080 回答
0

我发现如果我将 TriggerKey 更改为 TK_ENTER(triggerkey 枚举中的另一个值),我可以毫无问题地与图像控件交互。现在我只需要找到一种方法来捕捉那个 Enter 按键,以防止它做任何奇怪的事情。

感谢所有的帮助!

于 2011-03-18T20:05:29.737 回答