11

環境

  • Windows XP x32 Visual Studio 2005 Standard Edition
  • Windows Mobile 2003(Pocket PC 2003)を実行しているHoneywell Dolphin 9500
    • バーコードスキャナーと白黒カメラを内蔵
    • ここにあるSDKを使用します。
  • .NET Compact Framework1.0SP3および.NETFramework1.1
  • VC#の使用

ゴール

個人がバーコードをスキャンして画像をキャプチャできるアプリケーションを作成しようとしています。これらのことは同時に起こるべきではありません。ユーザーはバーコードスキャンを再確認してから、画像キャプチャを処理するアプリケーションの部分に移動できる必要があります。


問題

行番号は、以下の「コード」セクションのフレンドペーストリンクにある私のコードを参照しています。

2つのイベントハンドラーを配置しています。1つはバーコードスキャナーコントロールからのデコードイベント用で、もう1つはKeyDownイベントを介して画像キャプチャコントロールを呼び出すためのものです。デコードコントロールには、独自のイベント/ハンドラーDecodeEventHandlerと、列挙型(lns 201および202)が設定されたトリガーキーがあります。ただし、画像コントロールはそうではありません。そのドキュメントには、フォームにKeyDownイベントハンドラー(ln 120)とトリガーキー列挙型(ln 178)が必要であると記載されています。アプリケーションを実行すると(SelectedIndexChanged [ln 76]イベントハンドラーが配置されていない場合)、バーコードスキャナーは正常に機能しますが、画像キャプチャコントロールとデバイス(この場合はSCAN)のトリガーキーを押すと、ハンドヘルドはバーコードをスキャンしているように動作します(赤いライトが点灯し、緑の照準ライトが表示されます、


私が試したこと

  • 重要:アプリケーションからデコードコントロールを削除すると、イメージコントロールが機能します。画像コントロールのみを使用して別のアプリケーションを作成すると、機能します。
  • 210行目にブレークポイントを設定しましたが、KeyDownイベントがヒットしないことがわかりました。この時点で、イベントハンドラーまたはコントロールを何らかの方法で分離しようとしたため、タブコントロールにSelectedIndexChangedイベントハンドラーを導入し、適切なコントロールを使用してタブに切り替えたときに、イベントハンドラーを削除しようとしました。DecodeEventハンドラーを削除することはできましたが、作成したKeyDownイベントハンドラーデリゲートをヒットできませんでした。
  • HoneywellのSDKのデコードコントロールとイメージコントロールの両方に、(ドキュメントを引用するために)「スキャンエンジンから切断する」という「切断」イベントがあります。そこで、切り替えたタブに基づいてコントロールを切断して再接続しようとしましたが、これでも失敗しました。
  • また、フォームがフォーカスを失うと、フォームイベントが中断されることがあることもどこかで読みました。そこで、Form.LostControlイベント/ハンドラーを実装し、this.Focus()を挿入して、フォーカスをフォームに戻しましたが、役に立ちませんでした。
  • KeyPreview = trueを提案し、フォームレベルでイベントを処理/委任することを提案する複数の人々に出くわしました。私のFormオブジェクトにはKeyPreviewメンバーがないため、.NETCompactFrameworkバージョン1はこれを実装していないようです。
  • TriggerKey列挙型(202行目の例)内に、デバイスのEnterキーの列挙型があります。それをイメージコントロールまで配線し、デコーダーコントロールまでスキャンしてみましたが、それでもKeyDownイベントをヒットできませんでした。

コード

http://friendpaste.com/355cQOCghvPkE5YR29lthO

やや長い(〜230行)ので、フレンドペーストリンクとしてコードを投稿しました。ここに含めるだけでよいかどうか教えてください。


追加情報が必要ですか?

遠ざけてください、そして私は最善を尽くします!

私はこのHoneywellDolphin9500にタグを付けていただろうが、私は新しいユーザーです。

4

3 に答える 3

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-および-input-management.aspx

デコードコントロールが必要なメッセージを飲み込んでいるようです。HHP開発者サポートに連絡してみてください。彼らがオンライン開発者サポートフォーラムを持っているなら、それもうまくいくかもしれません。テストとして、192〜202行目をコメントアウトし始めるとどうなりますか?これらの行の1つにより、キーダウンイベントが機能しなくなりますか?

-PaulH

編集

imageControlとdecodeControlはどちらもTriggerKeyパラメーターを受け入れます。それは彼らが自分たちでキープレスイベントを処理することを期待しているように聞こえます。

これを試してください。現在使用しているタブに応じて、一度にインスタンス化するのは1つだけにしてください。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;
    }
}

これで、現在表示しているタブに応じて、そのうちの1つだけがスキャンボタンを監視します。

于 2011-03-16T15:35:11.080 に答える
1

KeyDownハンドラーに到達できないと思う理由は、 用のものTabControl1_IndexChangedSystem.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 に答える
0

TriggerKey を TK_ENTER (triggerkey 列挙型の別の値) に変更すると、問題なくイメージ コントロールを操作できることがわかりました。次に、その Enter キーの押下をキャプチャして、奇妙なことを行わないようにする方法を見つける必要があります。

助けてくれてありがとう!

于 2011-03-18T20:05:29.737 に答える