霍尼韦尔Dolphin 9500(Pocket PC 2003)C#事件处理冲突?

时间:2011-03-16 14:18:54

标签: c# windows-mobile compact-framework event-handling pocketpc

环境

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

目标

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


问题

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

我有两个事件处理程序:一个用于条形码扫描器控件的解码事件,另一个用于通过KeyDown事件调用图像捕获控件。解码控件有自己的事件/处理程序DecodeEventHandler和一个带有枚举(lns 201和202)的触发键。但是,图像控制没有。它的文档声明Form应该有一个KeyDown事件处理程序(ln 120)和触发器键enum(ln 178)。运行应用程序(没有SelectedIndexChanged [ln 76]事件处理程序),条形码扫描仪工作得很好,但切换到选项卡(或表格,因为我也尝试了单独的表格),与图像捕获控制和点击设备上的触发键(在这种情况下为SCAN)会使掌上电脑的行为类似于仍在扫描条形码(红灯亮起,绿灯瞄准灯亮,遇到条形码时发出哔哔声)而不是使用时通常显示的行为图像控制(没有灯光,或像闪光灯一样的白灯)。


我尝试过的事情

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

代码

http://friendpaste.com/355cQOCghvPkE5YR29lthO

我将代码发布为friendpaste链接,因为它有点长(~230行)。如果我应该把它包含在这里,请告诉我。


需要其他信息吗?

提出要求,我会尽我所能!

我会标记这款霍尼韦尔Dolphin 9500,但我是新用户。

3 个答案:

答案 0 :(得分:1)

我认为您无法访问KeyDown处理程序的原因是,TabControl1_IndexChanged的{​​{1}}是System.EventHandler,它是{KeyDown的通用形式1}}。

尝试做这样的事情,看看它是否正在捕捉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
   }

}

答案 1 :(得分: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事件停止工作吗?

-PaulH

修改

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;
    }
}

现在只有其中一个人会根据您所在的标签观看扫描按钮。

答案 2 :(得分:0)

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

感谢您的帮助!