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

问题描述:

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

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

所有用户推出其正在检查安装,那么版本的在线版本的安装程序,并在必要时启动它之前更新的应用程序。

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

所以我的主要问题是:如何在C#/ WPF中执行这样的技巧? 现在,我的最小化过程很简单(即使可能太简单):我只隐藏窗口&任务栏条目。现在我不知道如何来显示它从我的安装程序

任何想法了?

+0

真是个好主意。我也会说你可以/应该有一个启动画面出现,并给用户反馈,该应用程序正在加载,并在后台线程上处理这些初始查询。 –

+0

已经有一个启动画面,以完全清晰的方式显示加载状态。问题是我为交易员工作,他们总是有至少20个应用程序在6个以上的屏幕上运行,我无法以“TopMost”方式保持闪屏,因为它会干扰他们的工作,并且不检查它是否启动应用程序再次。我尝试添加一个NotifyIcon来获取信息,或者在TopMost中加载一个小的加载进度条,他们会继续启动它4到5次。不幸的是,现在该以另一种方式处理它:/ – Damascus

你的客户的要求永远是愚蠢的 - 他们付你钱。

为了使窗口前 - 创建全系统互斥锁,并检查其在应用程序启动的存在。如果它在那里 - 使用进程间通信机制将消息发送到其他实例以将其主窗口置于前面(窗口消息或命名管道 - 两者均可)。这里是an example(一定要检查相关的答案)。

,任何方式,只要你能防止一次又一次重新推出应用表明splash screen。如果它在1-2秒内不出现(2太长),那就很糟糕。您的应用程序的响应速度会让您觉得它的运行速度更快。

+0

感谢您的链接!我省略了它,因为它看起来很完美,但我确实有一个启动画面。我会检查一下 – Damascus

这是你要找的东西吗?

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 
} 

如果用户抱怨启动时间,也许考虑检查,而不是启动退出的版本。

+0

如果您同时启动应用程序的两个实例,那么又会如何确定另一个正在运行并退出? – svick

+0

的确如此,但我相信这将是一个边缘案例。尽管如此,你是对的。 – Peter

+1

如果我们不需要处理边界情况,编程将很容易。 – svick

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