2011-01-04 6 views
4

ok、タイトルはかなり長く、私は直面している問題を伝える必要があります。アイコントレイに最小化したときにここでそのプログラムの1つのインスタンスだけを許可すると、システムトレイからウィンドウを復元します。

はコードです:

private static void Main(string[] args) 
      { 
       bool createdNew = true; 
       using (Mutex mutex = new Mutex(true, "IPADcommunicator", out createdNew)) 
       { 
        if (createdNew) 
        { 
         Application.EnableVisualStyles(); 
         Application.SetCompatibleTextRenderingDefault(false); 
         Application.Run(new MainForm()); 
        } 
        else 
        { 
         Process current = Process.GetCurrentProcess(); 
         foreach (Process process in Process.GetProcessesByName(current.ProcessName)) 
         { 
          if (process.Id != current.Id) 
          { 
           IntPtr handle = FindWindow(null,"IPADcommunicator"); 
           SetForegroundWindow(handle); 
           ShowWindow(handle,5); 

           break; 
          } 
         } 
... 
:プログラムが既に開かれ、SYSトレイで、まだ誰かが、その後、それを別のインスタンスを開くために望んでいるされて

void MainFormResize(object sender, EventArgs e) 
     { 
      if (WindowState == FormWindowState.Minimized) 
      { 
       this.Hide(); 
       this.ShowInTaskbar = false; 
      } 
     } 

どのように正常に動作していません。メインウィンドウは復元されません。 私はたくさんのグーグルで検索しましたが、その問題の解決策は見つかりませんでした。 ありがとうございます!

答えて

6

不可視ウィンドウのSetForegroundWindow()の呼び出しは機能しません。 FindWindow()はnullを渡すときに悲惨なものです。

これを独自に作成しないでください。.NETには既に、単一インスタンスのアプリケーションに対する優れた組み込みサポートがあります。 2番目のコピーが開始されたときに通知を受け取って、コマンドラインを渡すことさえできます。あなたがここで欲しいのは、単にAPIをハックするのではなくウィンドウを復元するだけです。あなたが必要とするコードis here

1

ハンスからのリンクを含む数十のソリューションを調べた後、受け入れられた回答のリンクがシステムトレイからアプリを復元するとは思わない。それがしていると思われるのは、単一のインスタンスを正しく管理し、単一のインスタンスに引数を渡すことだけです。

シングルインスタンスを管理し、最小化されたウィンドウを復元し、シストレイウィンドウを復元できる、より完全なソリューションは、ここのコードプレックスで見つけることができます。 http://www.codeproject.com/KB/cs/SingleInstanceAppMutex.aspx

独自のコードに組み込むことも非常に簡単です。

関連する問題