2010-12-15 124 views
6

安装任何应用程序期间。通常要求用户在开始安装之前关闭所有窗口。如果没有,安装将停在中间 并要求用户关闭所有打开的窗口。 我被要求在XXX应用程序中添加代码。当应用程序正在运行,并且如果用户打开任何其他窗口(例如:Explore,浏览器,单词等),则应用程序应该抛出一个窗口,说明您已打开窗口列表。 我请求你,请建议我如何在C#中启动。获取打开的窗口列表C#

回答

0

尝试SetWinEventHook通过P/Invoke的WinAPI函数。你可以勾选EVENT_OBJECT_CREATE事件,但我不是100%确定的。我从来没有在C#中做过,只有在C/C++中。

1

您可以使用System.Diagnostics.Process类来获取机器中正在运行的所有进程的信息。然后,您可以尝试查找预期的应用程序/进程是否正在运行。

您可以使用GetProcesses()GetProcessByName()方法。请参阅this msdn link以供参考。我相信可以有更高效的方式来实现。 HTH

7

测试此:

var openWindowProcesses = System.Diagnostics.Process.GetProcesses() 
    .Where(p => p.MainWindowHandle != IntPtr.Zero && p.ProcessName != "explorer"); 

openWindowProcesses应该包含他们有一个活跃的主窗口中所有打开的应用程序。

我把p.ProcessName != "explorer"放在where表达式中,因为explorer是桌面的主进程,它永远不应该关闭。

要观察执行过程,您可以使用ManagementEventWatcher类。请参阅this

+0

为了解决需要通过定时器得到窗口列表中所描述的问题。隐藏的窗户是什么? – DReJ 2010-12-15 15:23:35

+0

我想谁问这个问题知道关于使用计时器和......关于隐藏的窗口;在这种情况下,我认为这足以关闭具有未隐藏窗口的进程。尽管在这些情况下,流程比窗口更重要。程序员应该检查进程,找出哪一个不应该打开。通过更改Where方法中的表达式很容易实现。 但是,谢谢!我将在我的答案中添加关于观看过程的一些信息。 – 2010-12-15 15:35:51

+0

非常感谢您的建议。一旦我执行,我会让你知道结果 – user517206 2010-12-16 05:57:58

1

建立一个foreach循环像这样枚举系统上的所有打开的应用程序(即有明显的主窗口)

foreach (var process in Process.GetProcesses().Where(p => p.MainWindowHandle != IntPtr.Zero)) { 
    //do something with the process here. To display it's name, use process.MainWindowTitle 
    } 
+0

如果应用程序有多个可见窗口,该怎么办? – Neolisk 2015-12-29 17:06:51