从其他进程单击其他窗口的按钮

时间:2014-04-20 19:45:52

标签: c winapi sendmessage

我是WinAPI的新手,我已经创建了一个空窗口。现在我想对Cheat Engine的教程程序进行一些修改。我已经知道,如何更改其他进程的内存中的值。但是只要我在教程程序中更改了一个值,就会被迫单击“下一步”按钮。所以我的问题是:是否可以将click命令发送到另一个进程的窗口?我有一个窗口句柄,一个进程句柄和进程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。我是否必须在hProc中使用pid而不是SetWindowsHookEx (WH_CALLWNDPROC, &fnHook, NULL, pid);

1 个答案:

答案 0 :(得分:0)

最简单的方法是使用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));

这在您的特定情况下可能有效,也可能无效;如果您尝试点击的地点实际上是在儿童窗口或弹出窗口中,那么您只需点击“#34;"错误的窗口,很多应用依赖其他消息。

更可靠的方法是调用SetWindowsHookEx(WH_MOUSE,...)和"播放"鼠标消息通过给定的钩子程序。我几十年没有做到这一点,所以不能详细谈论它。