0

activate イベントが発生するたびに、プロセス外の COM オブジェクトから文字列を要求する VB.NET Windows フォーム アプリを作成しました。私のフォームには 2 つのタブがあるため、ウィンドウがフォーカスされるたびにプログラムで正しいタブに切り替える必要があります。までは正常に動作します...

偶然、誰かが以下を含む vbscript (はい、exe ではなくスクリプト) を実行しました。

    Set shell = CreateObject("WScript.Shell")
    shell.AppActivate("Window Title That Matches My App")

このスクリプトは常にアプリをクラッシュさせます。通常、非常にひどいため、例外ダイアログは通常、それ自体を描画できません。タスクマネージャーから強制終了する必要があります。場合によっては、例外が読み取り可能です。(Visual Studioで実行中のexeにアタッチして例外を確認しました)。「System.Runtime.InteropServices.COMException (0x8001010D): アプリケーションが入力同期呼び出しをディスパッチしているため、発信呼び出しを行うことができません。」

私の心を本当に混乱させているのは、私のアプリにはミューテックスを使用した複数のインスタンス検出があり、既存のインスタンスが実行されている場合、私自身のコード (コンパイル済み) は VB.NET 独自の AppActivate キーワードを使用し、これは私のアプリをクラッシュさせません。実行中のインスタンスをアクティブ化し、期待どおりに冗長インスタンスを終了します。

この問題は、cscript/wscript の AppActivate によってのみ引き起こされるようです。これを確認するために、3 ライナーの .vbs を作成しました。繰り返し可能です。

コンパイルしたアプリでこれをトラップまたは回避する方法はありますか?

4

1 に答える 1

0

このアプローチが実際に問題を解決する理由は明らかではありませんが、機能します。

  1. フォームにタイマーを追加します。
  2. すべての _Activated コードをタイマーの _Tick イベントに移動します。
  3. _Activated イベントでタイマーを開始します。
  4. _Tick イベントでタイマーを停止させてから、COM スタッフを実行します。
于 2013-06-24T13:39:50.013 に答える