2011-08-24 23 views
7

संभव डुप्लिकेट:
What is the correct way to create a single instance application?यह जांचने के लिए कि क्या कोई WPF एप्लिकेशन पहले से चल रहा है या नहीं?

मैं कैसे जांच कर सकते हैं अपने आवेदन पहले से ही खुला है? यदि मेरा एप्लिकेशन पहले से चल रहा है, तो मैं इसे एक नया उदाहरण खोलने के बजाय दिखाना चाहता हूं।

+0

क्या प्रति कंप्यूटर, प्रति उपयोगकर्ता या प्रति डेस्कटॉप एक उदाहरण है? – adrianm

उत्तर

13
[DllImport("user32.dll")] 
private static extern Boolean ShowWindow(IntPtr hWnd, Int32 nCmdShow); 

static void Main() 
{ 
    Process currentProcess = Process.GetCurrentProcess(); 
    var runningProcess = (from process in Process.GetProcesses() 
          where 
          process.Id != currentProcess.Id && 
          process.ProcessName.Equals(
           currentProcess.ProcessName, 
           StringComparison.Ordinal) 
          select process).FirstOrDefault(); 
    if (runningProcess != null) 
    { 
     ShowWindow(runningProcess.MainWindowHandle, SW_SHOWMAXIMIZED); 
     return; 
    } 
} 

विधि 2

static void Main() 
{ 
    string procName = Process.GetCurrentProcess().ProcessName; 

    // get the list of all processes by the "procName"  
    Process[] processes=Process.GetProcessesByName(procName); 

    if (processes.Length > 1) 
    { 
     MessageBox.Show(procName + " already running"); 
     return; 
    } 
    else 
    { 
     // Application.Run(...); 
    } 
} 
+1

रीप्ले के लिए धन्यवाद लेकिन यह मेरे लिए अस्पष्ट था। मैं नहीं जानता कि इस कोड का उपयोग कहां करें। मुख्य विंडो में या app.xaml में? लॉग इन संवाद परिणाम = सत्य अगर मुख्य विंडो खुलती है। मैं नहीं जानता कि कैसे दिखाना है, खुले आवेदन को अधिकतम करें –

+1

यह कोड मुख्य विधि पर जाना चाहिए। मुख्य विधि के बारे में अधिक जानकारी के लिए यहां देखें। http://joyfulwpf.blogspot.com/2009/05/where-is-main-method-in-my-wpf.html – CharithJ

-1

यह कार्य करें:

using System.Threading; 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     bool result; 
     Mutex oMutex = new Mutex(true, "Global\\" + "YourAppName", 
      out result); 
     if (!result) 
     { 
      MessageBox.Show("Already running.", "Startup Warning"); 
      Application.Current.Shutdown(); 
     } 
     base.OnStartup(e); 
    } 
+0

यह मौजूदा उदाहरण की खिड़की नहीं दिखाया जाएगा –

+0

इस प्रयास करें, मैं यह परीक्षण किया गया। – saber

+1

मैंने अभी इसका परीक्षण किया। पहली बार जब आप एप्लिकेशन चलाते हैं, तो फॉर्म सामान्य रूप से दिखाता है। दूसरी बार, आपको "पहले से चल रहा है" कहकर एक संवाद मिलता है, और जब आप उस संवाद को खारिज करते हैं तो कुछ भी नहीं होता है। ओपी उस मामले में आवेदन के मूल उदाहरण को दिखाना चाहता था। अपने समाधान का उपयोग करके, यदि मैं मूल उदाहरण को कम करता हूं, या इसके सामने नोटपैड डालता हूं, तो इसे अग्रभूमि में नहीं लाया जाता है। –

2
public partial class App 
    { 
     private const string Guid = "250C5597-BA73-40DF-B2CF-DD644F044834"; 
     static readonly Mutex Mutex = new Mutex(true, "{" + Guid + "}"); 

     public App() 
     { 

      if (!Mutex.WaitOne(TimeSpan.Zero, true)) 
      { 
       //already an instance running 
       Application.Current.Shutdown(); 
      } 
      else 
      { 
       //no instance running 
      } 
     } 
    } 
+0

के लिए काम नहीं करता है मेरे .NET 4.0 WPF ऐप के लिए काम नहीं करता है? – Darren

1

यहाँ एक लाइन कोड है जो आप के लिए यह कर देगा ... है

if (Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length > 1) 
{ 
// Show your error message 
} 
संबंधित मुद्दे

 संबंधित मुद्दे