2

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

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

4

2 回答 2

0

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

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

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

检查这两个事件的原因是某些窗口被创建为隐藏然后显示,其他窗口被创建为完全可见,而其他窗口被创建一次,然后在其生命周期内多次显示/隐藏。

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

--

如果最近的弹出窗口是一个获得焦点的活动窗口 - 就像对话框的情况,但通常不是“弹出”窗口的情况 - 你可以使用GetGUIThreadInfo(NULL, ...)来确定当前活动的 HWND ,这可能是您正在寻找的那个,在您传递给它的结构的 GUITHREADINFO.hwndActive 成员中返回。

于 2012-06-01T07:14:47.977 回答
0

我没有对此进行测试,但我相信您可以尝试以下方法:

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

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

于 2012-05-29T18:40:16.723 回答