スキップしてメイン コンテンツへ

 none
USB接続サイネージに画面を表示しているC#.NETアプリケーションが、動作中にUSBを抜くとフリーズしてしまう。 RRS feed

  • 質問

  • 以下の事象で、解決策を探しています。

    USB接続サイネージに画面を表示しているC#.NETアプリケーションがあり、

    動作中にUSBを抜くとアプリがフリーズしてしまう現象があります。

    USBを抜くと、以下の状態になります。

    • 左クリックイベントに登録したイベントハンドラメソッドが呼ばれない
    • 左クリックしたときのWindow Message(WM_LBUTTONUP, WM_LBUTTONDOWN)はアプリケーションに通知される
      → 当該画面のWndProc()にブレークポイントを置くことで確認可能
      → このことからアプリケーションのGUIスレッドは停止していないことがわかる

     ・右クリックイベントは処理されるようだ右クリックイベントは処理される模様

      → 例えば画面上のボタンを右クリックすると、当該ボタンがフォーカス表示される

      → フォーカス表示はWPFが行っているため、右クリックイベントは処理されていることが推測できる

    USBケーブルを抜いた際にWindow Message WM_TABLET_DELETEがアプリケーションに届いている。

    このメッセージがアプリケーションに何らかの影響を与えているものでしょうか?

    2019年4月17日 9:57

すべての返信

  • ご質問の「USB接続サイネージ」と言うものが、調べても今一つピンと来ないのですが、もし市販製品であるなら具体的な製品名や型番を出した方が回答が集まり易い様に思います。もし、ご自身で開発されているものなら、USB HIDに何が物理的に接続されているか、どの様なアプリケーションを動作させているのか等のシステム構成の情報が無いと、アドバイスがし難いのではないかと思います。
    2019年4月18日 16:13
    モデレータ
  • ご指摘ありがとうございます。

    今一度整理しますと、問題は「USB接続サイネージ」とタブレットPCの組み合わせで発生しています。システム構成は次のとおりです。

    - 「USB接続サイネージ」といっているものは、「GeChic OnLap1002」という製品で、(広告とユーザー様の顧客が操作を行うための)タッチスクリーンモニターです。
    - このモニターはアプリケーションを動作させるタブレットPCのサブディスプレイであり、タブレットPCのUSBとHDMIに接続しています。
    - タブレットPC(例えばMS Surfaceなど)と上記タッチスクリーンモニターの組み合わせで問題が再現します。
    - ノートPCとタッチスクリーンモニターの組み合わせでは問題再現しない。
    - アプリケーションは、C#6.0 .Net4.6.1 WPFアプリケーションで、私共で開発しているものです。
    - このアプリケーションはメインディスプレイにユーザー操作用のウィンドウを表示し、かつタッチスクリーンモニターに対して広告やユーザー操作用のウィンドウを表示します。
    - 特にアプリケーションのクリック時の処理は、例えば「System.Windows.Controlos.Button.Click」にメソッドを委譲する形で実装しています。

    問題の発生契機は、アプリケーション実行中にタッチスクリーンモニターのUSBを抜いたときです。次のような状況になります。

    - ウィンドウメッセージ WM_TABLET_DELETED:0x02c9(WM_TABLET_DEFBASE:0x02c0 + 9)をアプリケーションが受けます。
    - メインディスプレイに表示されているウィンドウ並びにサブディスプレイに表示されているアプリケーションのウィンドウに対して、タブレットPCのマウス左クリックおよびタッチ操作が無応答になります。
    - ただし右クリックには応答します。
    - アプリケーション以外のウィンドウは左クリック操作に応答します。

    特に上記のメッセージが特徴的だと思っているのですが、このメッセージがアプリケーションに何らかの影響を与えているものでしょうか?
    あるいは、そもそもこのメッセージに対してアプリケーションは何らか処理を行うよう実装する必要があるのでしょうか。
    2019年4月22日 1:49
  • とりあえず考えられる原因として思いつくのは、Message Hook の有無。。。。
    その USB Touch Screen Monitor を取り外す前後で、該当アプリに対して Load あるいは Unload されているモジュールが存在していないか、"Process Explorer" あるいは "Process Monitor" で確認されることをお勧めします。
    2019年4月22日 2:36
  • Replyありがとうございます。

    頂いた内容を元に調査を進めてみます。

    2019年4月23日 1:48