2013-08-16 3 views
1

WPF 응용 프로그램이 다른 응용 프로그램 인스턴스가 실행 중인지 확인할 수 있습니까? 하나의 인스턴스 만 있어야하는 응용 프로그램을 만들고 사용자가 다시 열려고하면 "다른 인스턴스가 실행 중입니다."라는 메시지를 표시합니다.WPF 응용 프로그램의 다른 인스턴스가 실행되고 있는지 확인하십시오.

내 응용 프로그램의 이름과 일치하도록 프로세스 로그를 확인해야 겠지만 어떻게해야하는지 잘 모르겠습니다.

+2

[이름으로 프로세스 가져 오기] (http://msdn.microsoft.com/en-us/library/z3w4xdc9.aspx),이 작업을 수행하는 방법과 관련하여 여러 가지 다른 질문이 있습니다. [즉 뮤텍스] (http://stackoverflow.com/questions/184084/how-to-force-c-sharp-net-app-to-run-only-one-instance-in-windows) – Sayse

답변

7

exe가 복사되고 이름이 바뀌면 이름 처리 방법으로 프로세스가 실패 할 수 있습니다. .vshost가 프로세스 이름에 추가되기 때문에 디버깅도 문제가 될 수 있습니다.

<Application x:Class="SingleInstance.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
</Application> 

그 후, 당신이 갈 수 있습니다 ... 당신이 다음과 같습니다 있도록 App.Xaml 파일에서 StartupUri 속성을 제거하여 시작할 수 있습니다, WPF에서 단일 인스턴스 응용 프로그램을 만들려면 App.xaml.cs를 파일과는 다음과 같습니다 있도록 변경 ...

public partial class App 
{ 
    // give the mutex a unique name 
    private const string MutexName = "##||ThisApp||##"; 
    // declare the mutex 
    private readonly Mutex _mutex; 
    // overload the constructor 
    bool createdNew; 
    public App() 
    { 
     // overloaded mutex constructor which outs a boolean 
     // telling if the mutex is new or not. 
     // see http://msdn.microsoft.com/en-us/library/System.Threading.Mutex.aspx 
     _mutex = new Mutex(true, MutexName, out createdNew); 
     if (!createdNew) 
     { 
      // if the mutex already exists, notify and quit 
      MessageBox.Show("This program is already running"); 
      Application.Current.Shutdown(0); 
     } 
    } 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     if (!createdNew) return; 
     // overload the OnStartup so that the main window 
     // is constructed and visible 
     MainWindow mw = new MainWindow(); 
     mw.Show(); 
    } 
} 

뮤텍스가 존재하는 경우이 테스트되고이 존재하는 경우, 응용 프로그램이 메시지를 표시하고 종료됩니다. 그렇지 않으면 응용 프로그램이 생성되고 OnStartup 재정의가 호출됩니다.

Windows 버전에 따라 메시지 상자를 올리면 기존 인스턴스가 Z 순서의 맨 위로 이동합니다. 그렇지 않은 경우 창을 맨 위에 올리는 것에 대해 다른 질문을 할 수 있습니다.

Win32Api에는 동작을 추가로 사용자 지정하는 데 도움이되는 추가 기능이 있습니다.

이 방법을 사용하면 나중에 메시지 알림이 표시되고 주 창의 인스턴스가 하나만 생성되도록 할 수 있습니다.

+0

결함이 있습니까? 이 개념에? 또한 메시지를 표시하는 대신 이미 실행중인 인스턴스에만 초점을 맞추는 방법이 있습니까? Thx –

+0

@StefanVasiljevic 예, 몇 개. 새로운 질문을 열고 준비가되면 나를 핑 (ping) 할 수 있습니다. 이 질문에서 메시지 등록이나 Win32 API를 탐색 할 충분한 공간이 없습니다. –

+1

좋은 답변입니다. 비슷한 질문에 대한 몇 가지 다른 답변보다 훨씬 명확합니다. – ElDoRado1239

관련 문제