Honeywell Dolphin 9500 (Pocket PC 2003) C# 事件处理冲突?

Posted

技术标签:

【中文标题】Honeywell Dolphin 9500 (Pocket PC 2003) C# 事件处理冲突?【英文标题】:Honeywell Dolphin 9500 (Pocket PC 2003) C# Event Handling Conflicts? 【发布时间】:2011-07-16 15:27:27 【问题描述】:

环境

Windows XP x32 Visual Studio 2005 标准版 Honeywell Dolphin 9500 运行 Windows Mobile 2003 (Pocket PC 2003) 内置条码扫描仪和黑白相机 使用位于 here 的 SDK。 .NET Compact Framework 1.0 SP3 和 .NET Framework 1.1 使用 VC#

目标

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


问题

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

我有两个事件处理程序:一个用于来自条形码扫描仪控件的解码事件,另一个用于通过 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,但我是新用户。

【问题讨论】:

【参考方案1】:

我认为您无法访问KeyDown 处理程序的原因是TabControl1_IndexChanged 的处理程序是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
   


【讨论】:

首先感谢您的回复。但是,无论有没有 SelectedIndexChanged 事件处理程序,我都无法点击 KeyDown 事件处理程序。除此之外,我还是尝试了您所说的,但无济于事。再次感谢,我不知道,任何学习都是好的学习! 编辑让我更清楚:我尝试了你所说的,但是在按键时,没有调用 SelectedIndexChanged。【参考方案2】:

这有点小技巧,但我认为它会起作用。设置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 事件停止工作?

-保罗赫

编辑

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;
    

现在只有其中一个人会观看扫描按钮,具体取决于您所在的选项卡。

【讨论】:

对于我缺乏经验,我提前道歉,但是如何使用 P/Invoke 签名或如何允许我的应用程序访问 AllKeys 功能? 我不知道你为什么要为此道歉。毕竟,这是一个开发者帮助论坛。 MSDN 有一个关于从托管代码(P/Invoke)调用 Win32 API 的教程:msdn.microsoft.com/en-us/magazine/cc164123.aspx 这当然让我的应用程序捕获了 KeyDown 事件!但是,我的问题现在偏向另一个方向。 KeyDown 事件优先于 DecodeEvent。这本身不是问题,除了 KeyDown 事件需要 EventArgs 的类型为 KeyEventArgs 才能调用它,而 DecodeEvent 需要第二个参数的类型为 DecodeEventArgs 类型,而我无法从 KeyEventArgs 进行转换。这意味着我不能委派解码任务,因为我不能正确调用我的 DecodeEvent 处理函数(第 148 行)。想法? 虽然两个控件都接受 TriggerKey,但实际上只有解码控件执行自己的事件/键处理。基于文档和示例程序的图像控件需要使用者连接 KeyDown 事件处理程序。此外,如果我将 TriggerKey 设置为 TK_ONSCAN 或 TK_ENTER 以外的任何内容,则控件(解码控件)无法取消注册热键并且应用程序崩溃并显示“热键未取消注册”。 TriggerKey 枚举器中甚至还有一个 TK_NONE 并且失败并出现相同的错误。显然,控件没有正确编码以接受这种行为。【参考方案3】:

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

感谢大家的帮助!

【讨论】:

以上是关于Honeywell Dolphin 9500 (Pocket PC 2003) C# 事件处理冲突?的主要内容,如果未能解决你的问题,请参考以下文章

怎么通上位机发送 指令控制honeywell 3310g触发扫描

Honeywell1900条码扫描枪常见设置方法

Honeywell &Microsoft 联合会议!

honeywell1900扫描枪的使用说明

HONEYWELL UniSim Design Suite R451 Build 20113 1DVD

Java并发编程:深入剖析ThreadLocal 转载https://www.cnblogs.com/dolphin0520/p/3920407.html