【问题标题】:Click button of other window from other process从其他进程单击其他窗口的按钮
【发布时间】:2014-04-20 19:45:52
【问题描述】:

我是 WinAPI 新手,我已经创建了一个空窗口。现在我想为 Cheat Engine 的教程程序做一个小技巧。我已经知道,如何更改其他进程内存中的值。但是,一旦我在教程程序中更改了一个值,我就不得不单击“下一步”按钮。所以我的问题是:是否可以将点击命令发送到另一个进程的窗口?我有一个窗口句柄、一个进程句柄和进程 ID(如果不是一样)。

我对按钮的唯一了解是,它们的文本始终是“下一个”。

这是我的代码的缩短版本:

HWND hWnd = FindWindow (NULL, L"Window's title");               // Search startup window

DWORD pid;                                                      // Get process id
GetWindowThreadProcessId (hWnd, &pid);

HANDLE hProc = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pid);    // Get access to process

DWORD base = 0x789ABCDE;                                        // Get value of static pointer
ReadProcessMemory (hProc, &base, &base, 4, NULL);

WORD offset = 0xBCDE;                                           // Write to memory
WriteProcessMemory (hProc, (void *)(base + offset), (void *)5000, 4, NULL);

// Send click command (???)

对不起,如果我的英语和/或一些技术术语不正确,但我是 Win32 的新手。


编辑: 我发现,本教程禁止所有内存访问,所以我的项目永远不会工作。此外,当我尝试为教程程序安装第二个 Windows 程序时,GetLastError(); 总是返回 ERROR_INVALID_PARAMETER。我必须在SetWindowsHookEx (WH_CALLWNDPROC, &fnHook, NULL, pid); 中使用hProc 而不是pid 吗?

【问题讨论】:

  • 使用spy++获取按钮id。
  • 为什么不使用自动化?
  • 我没有spy++(VS2013 Express);自动化?
  • 是自动化。这是在不同进程中调用 gui 操作的受支持方式。在这里很难看出入侵进程内存的相关性。
  • 您的编辑没有多大意义。你似乎在随意尝试。再次,有人想知道为什么您不会使用自动化。你为什么要让自己的生活变得艰难?

标签: c winapi sendmessage


【解决方案1】:

最简单的方法是使用 SendMessage() 向给定窗口发送 WM_LBUTTONDOWN 和 WM_LBUTTONUP 消息,类似于

// x, y are the coords
SendMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(x, y));
SendMessage(hWnd, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(x, y));

这在您的特定情况下可能有效,也可能无效;如果您尝试单击的位置实际上位于子窗口或弹出窗口中,则您只是“单击”了错误的窗口,并且许多应用程序都依赖于其他消息。

更可靠的方法是调用 SetWindowsHookEx(WH_MOUSE, ...),并通过给定的挂钩过程“播放”鼠标消息。我已经有几十年没有这样做了,所以不能真正详细地谈论它。

【讨论】:

  • -1 SendMessage 方法很脆弱。如果目标进程挂起,您的进程也会挂起。它依赖于它无法控制的外部状态。目标窗口可能会在您的两次调用之间变得模糊,从而导致 WM_LBUTTONUP 被分派到另一个窗口。 SendMessage 也受 UIPI 约束。窗口挂钩不能用于“播放” 鼠标消息。它只能充当观察者。可靠且记录在案的解决方案是UI Automation
猜你喜欢
  • 2014-02-19
  • 2012-06-02
  • 2015-03-28
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 2020-10-19
  • 1970-01-01
相关资源
最近更新 更多