【问题标题】:How to switch to another running application using its process id in C++?如何使用 C++ 中的进程 ID 切换到另一个正在运行的应用程序?
【发布时间】:2014-04-07 16:22:58
【问题描述】:

当我知道它的进程 ID 时,如何切换到另一个在 Windows 7 和 C++ 中运行的应用程序?

我只有进程 ID。可能有多个具有相同名称的应用程序,因此使用窗口标题不起作用。我也没有可靠的 HWND 可以使用。

我希望应用程序处于活动状态、可见并准备好输入,就像我使用 alt-tab 切换到它一样。

【问题讨论】:

  • 你试过明显的c++ windows switch to application搜索吗?
  • 只需枚举所有顶级窗口,直到找到属于具有WS_EX_APPWINDOW 样式集的PID 的窗口。将该窗口置于 z 顺序的前面并为其提供输入焦点。
  • 这并不能真正可靠地工作,因为不是每个应用程序都有 WS_EX_APPWINDOW 样式集。
  • 如果应用程序出现在任务栏或任务切换窗口中,则它具有WS_EX_APPWINDOW 样式。如果没有,请选择让您尽可能接近的标准。
  • 在我试过的 6 个任务栏上的应用程序中,只有 1 个设置了 WS_EX_APPWINDOW 样式。简单地选择可能无法可靠运行的标准听起来很草率。

标签: c++ windows pid


【解决方案1】:

试试

HWND hNewWindow = FindWindow(...); // get window handle by title etc.
if (hNewWindow)
{
    DWORD hCurrentWindowThread = GetWindowThreadProcessId( hWndCurrentWindow, NULL );
    DWORD hNewWindowThread = GetWindowThreadProcessId( hNewWindow, NULL);
    AttachThreadInput( hCurrentWindowThread, hNewWindowThread, TRUE );
    SetForegroundWindow(hNewWindow);
    AttachThreadInput( hCurrentWindowThread, hNewWindowThread, FALSE );
}

SetForegroundWindow 正在做你想要的魔法。它有这里列出的限制SetforegroundWindow() API

来自here.的解决方案

【讨论】:

  • 我不能使用 FindWindow,因为它使用窗口标题,并且与进程 ID 不同,它不是唯一的。
  • 请注意,这可能会找到一个不可见的窗口或其他一些不打算进行交互的窗口。
猜你喜欢
  • 2014-05-07
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 2014-03-09
  • 2018-09-06
  • 1970-01-01
相关资源
最近更新 更多