【发布时间】:2015-10-03 21:50:50
【问题描述】:
在安装任何应用程序期间。通常要求用户在开始安装之前关闭所有窗口。如果不是,安装将在中间停止 并要求用户关闭所有打开的窗口。 我被要求在 XXX 应用程序中添加代码。当应用程序运行时,如果用户打开任何其他窗口(例如:探索、浏览器、word 等) 那么应用程序应该抛出一个窗口,说明您已经打开了窗口列表。 我请求你请建议我如何从 C# 开始。
【问题讨论】:
在安装任何应用程序期间。通常要求用户在开始安装之前关闭所有窗口。如果不是,安装将在中间停止 并要求用户关闭所有打开的窗口。 我被要求在 XXX 应用程序中添加代码。当应用程序运行时,如果用户打开任何其他窗口(例如:探索、浏览器、word 等) 那么应用程序应该抛出一个窗口,说明您已经打开了窗口列表。 我请求你请建议我如何从 C# 开始。
【问题讨论】:
测试一下:
var openWindowProcesses = System.Diagnostics.Process.GetProcesses()
.Where(p => p.MainWindowHandle != IntPtr.Zero && p.ProcessName != "explorer");
openWindowProcesses 应该包含所有打开的应用程序,它们有一个活动的主窗口。
我将p.ProcessName != "explorer"放在where表达式中,因为资源管理器是桌面的主进程,它永远不应该被关闭。
要查看进程的执行,您可以使用ManagementEventWatcher 类。请参阅this。
【讨论】:
您可以使用System.Diagnostics.Process 类来获取您机器中正在运行的所有进程的信息。然后您可以尝试查找预期的应用程序/进程是否正在运行。
您可以使用GetProcesses() 或GetProcessByName() 方法。参考this msdn link。我相信可以有更有效的方法来实现同样的目标。高温
【讨论】:
像这样设置一个 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
}
【讨论】:
通过 P/Invoke 尝试 SetWinEventHook WinAPI 函数。您可以挂钩EVENT_OBJECT_CREATE 事件,但我不是 100% 确定。我从来没有在 C# 中做过,只在 C/C++ 中做过。
【讨论】: