2017-06-14 123 views
-1

我想用c#構建一個實例WPF應用程序。我按照this answer創建以下應用程序。但是,無論我重新啓動相同的應用程序多少次(雙擊* .exe文件),OnStartupNextInstance函數都不會被調用。OnStartupNextInstance不會被調用

調試輸出中沒有任何例外或任何內容。

有沒有人有使用這種方法工作的單個實例WPF應用程序?我在這裏錯過了什麼?

using Microsoft.VisualBasic.ApplicationServices; 
using System; 
using System.Windows; 

namespace WpfApp1 
{ 
    public class EntryPoint 
    { 
     [STAThread] 
     public static void Main(string[] args) 
     { 
      var man = new SingleInstanceManager(); 
      man.Run(args); 
     } 
    } 

    public class SingleInstanceManager : Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase 
    { 
     public SingleInstanceManager() 
     { 
      IsSingleInstance = true; 
     } 

     protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs eventArgs) 
     { 
      MessageBox.Show("First time launch"); 
      var app = new App(); 
      app.InitializeComponent(); 
      app.Run(); 
      return false; 
     } 

     protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs) 
     { 
      MessageBox.Show("Subsequent launch"); 
      base.OnStartupNextInstance(eventArgs); 
      eventArgs.BringToForeground = true; 
     } 
    } 
} 
+0

在你的鏈接中,它建議使用'public void Activate()'方法來激活MainWindow(並在OnStartupNextInstance中調用它),這可能是相關的嗎?你也可以嘗試在OnStartupNextInstance的第一行放置一個斷點,並檢查調試模式,如果你的代碼到達那裏。 –

+0

你確定你正在調試正確的實例嗎? 'OnStartupNextInstance()'方法僅在原始進程中調用,而不是新進程。注意'MessageBox.Show()'。您應該看到該消息框啓動後續實例,並且您發佈的代碼中沒有任何內容會提示發生任何不同的事情。你確定你發佈的代碼實際上是你正在運行的代碼嗎? –

+0

@KeyurPATEL WPF應用程序沒有激活功能:( – Believe2014

回答

0
  • 構建應用程序。
  • 在Visual Studio的解決方案資源管理器中右鍵單擊您的項目,然後選擇「在文件資源管理器中打開文件夾」。
  • 如果您在發佈模式下構建應用程序,請瀏覽至bin/Debug(或bin/Release)文件夾。
  • 雙擊可執行文件(.exe)。然後你應該看到一個MessageBox說「首次發佈」。
  • 現在,沒有關閉MessageBox,再次雙擊同一個.exe文件。這應該彈出「後續發佈」MessageBox

請注意,如果關閉該應用程序,則會在啓動另一個實例時看到「首次啓動」消息再次彈出。只有當另一個實例正在運行時,OnStartupNextInstance纔會被調用。