WPF - 在任务管理器中显示隐藏但活动的应用程序

时间:2011-07-04 10:52:33

标签: c# wpf .net-4.0 process

我想为我的应用程序设置一个持久状态。让我解释。 启动时间有点长(主要是由于对远程服务器的许多数据库请求,需要5-10秒,甚至更多,因为我的用户通常运行的应用程序太多......)我想设置一个隐藏的方式&在需要时显示我的申请。

我现在正在做的是当用户点击红十字时只将app减少到托盘。 (只有当用户选择文件 - >退出时,应用程序才会真正退出。

所有用户都会启动安装程序,检查安装的版本,然后检查在线版本,并在启动之前根据需要更新应用程序。

现在,我希望首先检查进程监视器(在“任务管理器”,“进程”选项卡中找到的进程监视器),如果某个进程已在运行该应用程序,则它将再次显示该窗口。否则,如果没有进程正在运行,我们可以处理经典检查更新然后启动步骤。 这尤其会消除我经常遇到的许多愚蠢的客户请求(“嘿,你的应用程序需要很长时间才能加载,所以我再次点击它5次,它启动了6个实例!!!!”:/)因此保存我花了很多无用的时间让他们停止启动相同应用程序的50个实例,因为它不会让它更快......

所以我的主要问题是:如何在C#/ WPF中执行这样的技巧? 就目前而言,我的最小化过程有点简单(尽管可能过于简单):我只是隐藏了窗口和放大器。任务栏条目。现在我不知道如何从我的安装程序显示它

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

您的客户的要求永远不会是愚蠢的 - 他们会付钱给您。

将窗口置于前面 - 创建系统范围的互斥锁并在应用程序启动时检查其存在。如果它在那里 - 使用进程间通信机制将消息发送到另一个实例以将其主窗口置于前面(窗口消息或命名管道 - 两者都很好)。这是an example(确保也检查相关答案)。

并且无论如何都要尽快显示splash screen,以防止一次又一次地重新启动应用程序。如果它没有在1-2秒内出现(2太长)那就不好了。您的应用程序的响应性使其感觉更快。

答案 1 :(得分:2)

你正在寻找这样的东西吗?

foreach (var p in Process.GetProcesses()) 
{
    if (p.ProcessName.Contains("myProcess"))
    {
        //process is already running
    }
}

或者,使用LINQ:

if (Process.GetProcesses().Where(p => p.ProcessName.Contains("myProcess")).Any())
{
    //process is already running
}

如果用户抱怨启动时间,可以考虑在退出时检查版本,而不是启动。

答案 2 :(得分:1)

I have answered a very similar question yesterday.唯一缺少的是如何隐藏和显示窗口:使用Window.Visibility,将其设置为Visibility.Hidden以隐藏窗口并Visibility.Visible为再次展示它。

相关问题