2011-07-04 20 views
0

私のアプリケーションに永続的な状態を設定したいと思います。私に説明させてください。 起動時間はちょっと長いです(ほとんどの場合、リモートサーバーへの多くのデータベース要求があります。これは5〜10秒かかりますが、通常はユーザーのアプリケーションが多すぎるため...) &を隠す方法は、必要に応じて私のアプリケーションを示しています。WPF - タスクマネージャで非表示になっているがアクティブなアプリケーションを表示

私が今やっているのは、ユーザーが赤い十字架をクリックしたときにアプリをトレイに縮小することだけです。 (アプリケーションは実際には、ユーザーが「ファイル」 - >「終了」を選択した場合にのみ終了します)。

すべてのユーザーは、インストールされているバージョンを確認しているインストーラーを起動しています。また、オンラインで入手できるバージョンもあります。

ここでは、プロセスモニタ([プロセスマネージャ]の[プロセス]タブに表示されているプロセスモニタ)を確認してから、プロセスが既にアプリケーション用に実行されている場合は、再度ウィンドウが表示されます。それ以外の場合、プロセスが実行されていなければ、classic-check-for-update-then-launchのステップを処理できます。 これは、私が定期的に持っているたくさんの愚かな顧客のリクエストを特に排除します(「あなたのアプリケーションの読み込みには時間がかかりすぎますので、もう一度5回クリックして6つのインスタンスを起動しました!!!!」:/)私は多くの役に立たない時間が同じアプリケーションの50インスタンスを起動することを止めるのに費やして過ごしたが、それはそれをより速くすることはありません...

私の主な質問は:どのようにC#/ WPF ? 今のところ、私の最小化プロセスはちょっと単純すぎるかもしれませんが、私は単にタスクバーのエントリ&のウィンドウを隠しています。今、私はインストーラから戻す方法を知らない。

アイデア?

+0

いいアイデアです。また、スプラッシュ画面が表示され、アプリが読み込んでいるというフィードバックをユーザに与え、その初期クエリをバックグラウンドスレッドで処理することができます。 –

+0

ロード状態を完全にはっきりと示すスプラッシュ画面が既にあります。問題は私が6人以上のスクリーンで常に20以上のアプリケーションを実行しているトレーダーのために働いています。スプラッシュスクリーンを作業に支障をきたし、アプリケーションを起動することなくスプラッシュスクリーンを "TopMost"再び。私は情報のためにNotifyIconを追加しようとしました、またはTopMostの小さなロードプログレスバーで、彼らはそれを4または5回続けて続けます。今度は残念ながら別の方法でそれに取り組む時です:/ – Damascus

答えて

3

お客様のリクエストは決して愚かではありません。お金を払うことはありません。

ウィンドウを前面に表示する - システム全体のミューテックスを作成し、アプリケーションの起動時にその存在を確認します。そこにある場合は、プロセス間通信メカニズムを使用して他のインスタンスにメッセージを送信してメインウィンドウを前面に表示させます(ウィンドウメッセージまたは名前付きパイプ - 両方とも問題ありません)。ここではan exampleです(関連する回答も必ず確認してください)。

そして、何度もアプリケーションを再起動しないようにできるだけ早く表示してください。splash screen 1〜2秒で表示されない場合(2が長すぎます)、それは悪いです。アプリケーションの応答性は、動作が速いような気分になります。 Window.Visibilityを使用し、ウィンドウを非表示にするVisibility.Hiddenに設定し、Visibility.Visibleに再びそれを表示するには:欠けている

+0

リンクありがとうございます!私はそれが完全なロジックのように見えたので省略しましたが、スプラッシュ画面があります。私はそれを確認します – Damascus

2

これはあなたが探しているものですか?

foreach (var p in Process.GetProcesses()) 
{ 
    if (p.ProcessName.Contains("myProcess")) 
    { 
     //process is already running 
    } 
} 

または、LINQを持つ:ユーザーが起動時間に文句を言う場合

if (Process.GetProcesses().Where(p => p.ProcessName.Contains("myProcess")).Any()) 
{ 
    //process is already running 
} 

、多分代わりに起動、終了時にバージョンをチェックすることを検討してください。

+0

アプリケーションの2つのインスタンスを同時に起動すると、別のアプリケーションが実行されていると判断され、両方終了します。 – svick

+0

真実ですが、それは私が信じる辺のようなケースです。それにもかかわらず、あなたは正しいです。 – Peter

+1

エッジケースを処理する必要がなければ、プログラミングは簡単です。 – svick

関連する問題