如何在 c++ 中将光标移动到上次打开的窗口(可能是弹出窗口)

How to move the cursor to the last opened window (possibly popup) in c++

本文关键字:窗口 c++ 光标 移动      更新时间:2023-10-16

我需要将鼠标移动到上次打开的窗口。最后一个窗口将由任何网站创建的弹出窗口。我想我所需要的只是获取上次打开的窗口的位置并使用 SetMousePos,对吧?我不太熟悉 Windows API,欢迎任何帮助 - 谢谢!

编辑:为了回答这些问题,我们正在编写一个获取恶意软件数据的程序。不幸的是,某些恶意软件仅在鼠标移动到他们打开的弹出窗口后才开始工作。它是一个基于研究的应用程序

我还没有测试过这个,但我相信你可以尝试以下方法:

  1. 按 PID 枚举正在运行的进程和顺序。
  2. 最高编号的 PID 应该是"最新"过程。
  3. 对于最新的进程,枚举其窗口(使用 GetWindowThreadProcessId)
  4. 在这一点上,我想你必须选择你认为哪个窗口是"主"窗口,例如,如果恶意软件打开两个窗口,我不知道你将如何选择关注哪一个?
  5. 您选择的 HWND 在桌面上的位置。
  6. 使用 SetMousePos 将鼠标移动到窗口的位置。

我还没有包括这些任务所需的所有API,因为它通常很容易在这里找到:)

跟踪最近打开的窗口的一种方法是使用 SetWinEventHook 侦听EVENT_OBJECT_CREATE和EVENT_OBJECT_SHOW事件。在回调中,筛选:

  • 仅具有非空 HWND 的事件,其中 idObject==OBJID_WINDOW 仅获取窗口创建事件(相对于其他创建事件,例如列表框中的项目)
  • 对于仅顶级窗口,还要通过检查 GetAncestor(hwnd, GA_PARENT) 是 GetDesktopWindow() 进行过滤
  • 并检查窗口当前是否确实可见(WS_VISIBLE样式是在 GetWindowLong(GWL_STYLE) 中设置的)。

如果您只关心来自特定应用程序的 HWND,也可以通过 GetWindowThreadProcessId() 和通过您传递给 SetWinEventHook 的线程/进程进行过滤。

检查这两个事件的原因是,某些窗口是隐藏创建的,然后显示,其他窗口

是完全可见的,而其他窗口是创建一次,然后在其生命周期内多次显示/隐藏。

然后,您可以将这个"最后已知的创建的hwnd"缓存在全局中,并根据需要对其进行检查,使用GetWindowRect()获取其位置,并使用SetCursorPos()将鼠标移动到该位置。

--

如果最近的弹出窗口是获取焦点的活动窗口 - 就像对话框的情况一样,但通常不是"弹出式"窗口的情况 - 您可以使用GetGUIThreadInfo(NULL,...)以确定当前活动的 HWND,这可能是您要查找的 HWND,在传递它的结构的 GUITHREADINFO.hwndActive 成员中返回。