2012-03-21 15 views
0

を最小化し、プログラムのウィンドウを復元することができます。
Restore a minimized window of another applicationどのように私は可能性の重複トレイに

私は(ショーをしてフォーカスを与える)を復元したい外部プログラムに。

トレイ上にある場合、MainWindowHandleは0なので、ウィンドウを復元できないという問題があります。

Process[] process = Process.GetProcessesByName("MyApp"); 
//process.MainWindowHandle == 0 if it is on tray!! :(

私は既にGoogleとstackoverflowを検索しました。私は同じ質問のスレッドをいくつか見つけましたが、これに対する答えはありません。

[DllImport("user32.dll")] 
public static extern bool ShowWindow(IntPtr windowHandle, ShowWindowFlag flag); 

外部アプリケーションをトレイから取り出してタスクバーに移動するにはどうすればよいですか?私はFindWindowを、

[DllImport("User32.dll", CharSet = CharSet.Unicode)] 
    public static extern IntPtr FindWindow(string className, string windowName); 

を使用することができますが、同じクラスとタイトルを持つ多くの一つのプロセスがある場合、FindWindowをはどのように私はこの問題を解決することができ、それらの一方のみを返します?


+0

いいえ、それは重複していません、私の問題は、アプリが隠れて、トレイに最小化されます。 – Pedro77

答えて

4

問題は、システムトレイにウィンドウを最小化するサポートがないことです。そのような状態はありません。そして、この動作をシミュレートするために、アプリケーションはウィンドウを完全に隠すだけです。 Spy ++ツールを使用して、表示されているターゲットアプリケーションのウィンドウを見つけることができます。 それをトレイに「最小化」し、属性で何が変更されたかを確認します。あなたのアプリでは、属性を元に戻す必要があります。これは、ウィンドウを隠すためのいくつかの方法があり、異なるアプリケーションがそれらの1つを使用するため、必要です。

たとえば、Windowsのタスクマネージャは、スタイルをVS_VISIBLEからVS_MINIMIZEDに変更します(また、VS_VISIBLEを削除します)。

+0

ありがとうございます。アプリがすでにトレイに入っている場合はどうなりますか?それを解決する方法はありませんか? – Pedro77

+0

説明した手順は、ウィンドウの復元方法とそのクラスと名前を正確に見つけるために一度だけ実行する必要があります。次に、FindWindow WinAPI関数(またはそれと同等のC#で呼び出す方法がわかりません)を呼び出すと、ハンドルが返され、ウィンドウのスタイルを変更して再び表示させることができます。 –

+0

複数のアプリが同じクラスと名前で実行している場合はどうなりますか? – Pedro77