我是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);
?
答案 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,...)和"播放"鼠标消息通过给定的钩子程序。我几十年没有做到这一点,所以不能详细谈论它。