【问题标题】:Get the list of opened windows C#获取打开的窗口列表 C#
【发布时间】:2015-10-03 21:50:50
【问题描述】:

在安装任何应用程序期间。通常要求用户在开始安装之前关闭所有窗口。如果不是,安装将在中间停止 并要求用户关闭所有打开的窗口。 我被要求在 XXX 应用程序中添加代码。当应用程序运行时,如果用户打开任何其他窗口(例如:探索、浏览器、word 等) 那么应用程序应该抛出一个窗口,说明您已经打开了窗口列表。 我请求你请建议我如何从 C# 开始。

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    测试一下:

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

    openWindowProcesses 应该包含所有打开的应用程序,它们有一个活动的主窗口。

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

    要查看进程的执行,您可以使用ManagementEventWatcher 类。请参阅this。

    【讨论】:

    • 要解决所描述的问题,您需要通过计时器获取窗口列表。隐藏的窗户又是怎么回事?
    • 我想问这个问题的人知道使用计时器和......以及隐藏窗口;我认为在这种情况下关闭带有未隐藏窗口的进程就足够了。尽管在这些情况下,进程比窗口更重要。程序员应该检查进程以找出不应该打开的进程。这很容易通过更改 Where 方法中的表达式来实现。不过谢谢!我将在我的答案中添加一些有关观看过程的信息。
    • 非常感谢您的建议。一旦我实施,我会告诉你结果
    • 如果一个应用程序有多个可见窗口怎么办?
    【解决方案2】:

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

    您可以使用GetProcesses() 或GetProcessByName() 方法。参考this msdn link。我相信可以有更有效的方法来实现同样的目标。高温

    【讨论】:

      【解决方案3】:

      像这样设置一个 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
        }
      

      【讨论】:

      • 如果一个应用程序有多个可见窗口怎么办?
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-25
        • 2010-09-20
        • 1970-01-01
        • 2014-08-27
        • 2013-08-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多