3

InnoSetup には、プログラムが既に使用されているかどうかを知るための関数 "FindWindowByClassName" があります。私の場合、InnoSetup アップデートを実行する前に wpf アプリケーションが使用中かどうかを知りたいのですが、wpf アプリケーションのクラス名を知る方法がわかりません。アプリケーションで Spy++ を使用する場合、クラス名は次のとおりです。

HwndWrapper[MuProgram.exe;;1120a18a-2e29-4e19-8653-939c99b505c2]

ご覧のとおり、私のクラス名には GUID があり、この GUID は起動するたびに変更されます。しかし、いずれにせよ、InnoSetup を (デバッグ モードで) 実行すると、このクラス名を使用すると、FindWindowByClassName 関数は 0 を返します。

FindWindowByClassName('HwndWrapper[MyProgram.exe;;1120a18a-2e29-4e19-8653-939c99b505c2]'); // returns 0

「MyProgram.exe」のみを使用しようとしましたが、関数は常に 0 を返します (アプリケーション「MyProgram.exe」はテスト中に起動されます)。この問題を解決するアイデアはありますか? wpf コードでクラス名を設定できますか?

4

1 に答える 1

1

Inno Script ソース コードでは、 FindWindowByClassName が Windows のFindWindow関数を呼び出していることがわかります。既にお気づきのように、WPF フォームは呼び出しごとにクラス名を変更します。この StackOverflow answerによると、ランダムな GUID により、WPF クラスで FindWindow を使用できなくなります。

残念ながら、ウィンドウを検索する場合、RegEx またはワイルドカード機能はありません。GetWindowExなどを使用してすべてのウィンドウを検索し、デスクトップ ウィンドウのすべての子をループすることで、独自のウィンドウを作成できると思います。This StackOverflow answerは、WPF での古い API 呼び出しではなく、UI オートメーションの使用を提案しています。

@TLama が提案するミューテックスの代替手段は、検索するアプリを作成している場合に最適です。別のベンダーのアプリを見つけて閉じようとしている場合、それはそれほど簡単ではありません。また、 CheckForMutexesはウィンドウ ハンドルを返さないため、ウィンドウを閉じる方法は簡単ではありません。

于 2015-12-31T03:53:37.680 に答える