C# 检查WPF应用程序的其他实例是否为';t运行

C# 检查WPF应用程序的其他实例是否为';t运行,c#,wpf,instance,single-instance,C#,Wpf,Instance,Single Instance,WPF应用程序是否可以检查该应用程序的任何其他实例是否正在运行? 我正在创建一个应用程序,它应该只有一个实例,当用户再次尝试打开它时,它会提示一条消息“另一个实例正在运行” 我猜我必须检查进程日志以匹配我的应用程序的名称,但我不确定如何执行该操作。如果复制并重命名了exe,则按名称获取进程策略可能会失败。调试也可能有问题,因为.vshost被追加到进程名之后 要在WPF中创建单实例应用程序,可以从App.Xaml文件中删除StartupUri属性开始,使其看起来像这样 <Applicati

WPF应用程序是否可以检查该应用程序的任何其他实例是否正在运行? 我正在创建一个应用程序,它应该只有一个实例,当用户再次尝试打开它时,它会提示一条消息“另一个实例正在运行”


我猜我必须检查进程日志以匹配我的应用程序的名称,但我不确定如何执行该操作。

如果复制并重命名了exe,则按名称获取进程策略可能会失败。调试也可能有问题,因为.vshost被追加到进程名之后

要在WPF中创建单实例应用程序,可以从App.Xaml文件中删除StartupUri属性开始,使其看起来像这样

<Application x:Class="SingleInstance.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</Application>
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中还有其他功能,有助于进一步自定义行为


此方法会向您发送您所需的消息通知,并确保仅创建主窗口的一个实例。

如果复制并重命名了exe,则按名称获取进程策略可能会失败。调试也可能有问题,因为.vshost被追加到进程名之后

要在WPF中创建单实例应用程序,可以从App.Xaml文件中删除StartupUri属性开始,使其看起来像这样

<Application x:Class="SingleInstance.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</Application>
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中还有其他功能,有助于进一步自定义行为


这种方法为您提供了所需的消息通知,并确保只创建了主窗口的一个实例。

,尽管关于如何执行此操作还有许多其他问题,尽管关于如何做到这一点还有很多其他问题;这个概念有什么缺陷吗?还有,有没有办法只关注已经运行的实例,而不显示消息?Thx@StefanVasiljevic是的,好几个。你可以提出一个新问题,准备好后再打电话给我。在这个问题上,没有足够的空间深入研究消息注册或Win32 API。回答得很好。比其他几个回答类似问题的答案更清楚。这个概念有什么缺陷吗?还有,有没有办法只关注已经运行的实例,而不显示消息?Thx@StefanVasiljevic是的,好几个。你可以提出一个新问题,准备好后再打电话给我。在这个问题上,没有足够的空间深入研究消息注册或Win32 API。回答得很好。比其他几个对类似问题的回答要清楚得多。