检查 WPF 应用程序的其他实例是不是正在运行 [重复]

Posted

技术标签:

【中文标题】检查 WPF 应用程序的其他实例是不是正在运行 [重复]【英文标题】:Check if other instances of a WPF application are/aren't running [duplicate]检查 WPF 应用程序的其他实例是否正在运行 [重复] 【发布时间】:2013-08-16 09:31:51 【问题描述】:

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

我猜我必须检查进程日志以匹配我的应用程序的名称,但我不知道该怎么做。

【问题讨论】:

Get processes by name,尽管关于如何做到这一点还有很多其他问题; i.e mutex 【参考方案1】:

如果 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>

之后,您可以转到 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 中的其他功能将有助于进一步自定义行为。

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

【讨论】:

这个概念有什么缺陷吗?另外,有没有办法只关注已经运行的实例而不是显示消息?谢谢 @StefanVasiljevic 是的,有几个。您可以打开一个新问题,并在它准备好时联系我。在这个问题中没有足够的空间来深入研究消息注册或 Win32 API。 很好的答案。比对类似问题的其他几个答复要清楚得多。

以上是关于检查 WPF 应用程序的其他实例是不是正在运行 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 WPF 应用程序是不是已在运行? [复制]

如何检查应用程序的另一个实例是不是正在运行[重复]

如何检查 impala 守护进程实例和状态存储守护进程实例是不是正在运行?

发布文件是不是足以运行 WPF 应用程序?

Snoop使用什么技术来检查WPF应用程序

AWS Elastic Beanstalk 运行状况检查偶尔失败