【问题标题】:To identify the background process & bring to foreground in C++ WIN32在 C++ WIN32 中识别后台进程并将其置于前台
【发布时间】:2012-06-13 05:59:05
【问题描述】:

谁能告诉我如何识别特定的后台进程(即,已经在运行的应用程序)并将其带到前台?例如,如果记事本应用程序在后台运行,当我运行我的 WIN32 应用程序时,它应该识别记事本应用程序并且记事本应该弹出或进入前台。

我尝试了 SwitchToThisWindow() 函数,但它的工作方式类似于 Alt+tab。它不会识别后台进程。

请向我推荐这方面的演练指南..

谢谢你..

【问题讨论】:

  • 听起来像是 EnumWindowsSetForegroundWindow 的工作。
  • 在windows系统被前台进程蹂躏的时代,有一个函数反击了......它的名字是SetForegroundWindow
  • 是的,SetForegroundWindow 会将我的窗口保持在顶部。但是有什么方法可以识别后台进程吗?

标签: c++ winapi


【解决方案1】:

不清楚你所说的“后台进程”是什么意思,但这里有一些想法:

使用EnumWindows 让您所有桌面上的顶级 HWND。这将包括一堆你不想要的东西,你必须过滤掉。建议您使用 Spy++ 来查看 HWND 树的外观,以及您会在此处找到哪些类型的 HWND:

从这个集合中,您需要过滤掉或忽略不可见的 HWND(使用 IsWindowVisible 或检查 WS_VISIBLE 样式)。

同时过滤掉设置了 WS_POPUP 的窗口 - 这些窗口包括工具提示、菜单弹出窗口、浮动工具栏等。

要过滤掉当前活动的窗口,(如果你还不知道的话)使用GetGUIThreadInfo with idThread=0; GUIHREADINFO.hwndActive 返回活动窗口,因此任何不是它的顶级 HWND 都是非活动窗口。

如果您专门寻找最小化的窗口,您可以使用IsIconic(hwnd) 检测到这些窗口。

最后,当您找到一个您认为是“背景”的窗口时,您可以使用 GetWindowText 获取标题,或使用 GetWindowThreadProcessId 获取进程 ID。

【讨论】:

    【解决方案2】:

    但是有什么方法可以识别后台进程

    这是一个 Unix shell 概念,Windows 没有。现在我有 10 个“后台”进程创建了不在前台的窗口,另外 50 个左右没有。它们都不是后台进程,它们都同样具有背景。您通常单击窗口的任务栏按钮或按 Alt+Tab 将其中一个切换到前台。或者在代码中调用 SetForegroundWindow()。

    【讨论】:

    • 我认为它们是在给定窗口的“背景”进程之后。 *nix 窗口没有与进程紧密耦合(因为它可能在另一台机器上:)
    猜你喜欢
    • 1970-01-01
    • 2022-09-26
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    相关资源
    最近更新 更多