【发布时间】:2019-09-22 15:10:01
【问题描述】:
首先,我对 C++ 的了解非常有限。
几年前,我设法拼凑了一些代码,用于读取某些水果机仿真软件的内存区域。它基于带有字母“DX”的水果机窗口标题。
我使用的代码如下:
if (strstr(lpszTitle, "DX") && !strstr(lpszTitle, "=")) {
cout << "\nFound fruity with name: " << lpszTitle << "\n";
currentWindowName = lpszTitle;
// Found "DX" in the title of the window
// so it must be an MFME window
GetWindowThreadProcessId(hWnd, &pid);
HANDLE phandle = OpenProcess(PROCESS_VM_READ, 0, pid);
if (!phandle)
{
cout << "\nCould not get handle!\n";
soundHopperAlarm(5); // "Error, could not get window process handle"
cin.get();
}
else
{ // rest of code here...
当时有人告诉我,获取窗口句柄的更好方法是这段代码:
wchar_t process[] = L"MFME.exe";
DWORD pid= GetPID(process);
HANDLE phandle = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ, false, pid);
我没有更改我的代码,因为(当时)它适合我的目的。我只是更改了我正在模拟的所有“水果机”,使其标题中包含文本“DX”,并且效果很好......
但是,我目前正在尝试向系统中添加 1,000 多台水果机,如果有更强大的方法来获取窗口句柄而无需更改每个窗口标题,那将容易得多。
我无法真正理解新代码,简单地复制/粘贴到我现有的代码中会导致 GetPID 未定义的错误,所以我想知道是否有人可以帮助我提供一个强大的解决方案来获取打开的窗口的句柄通过“MFME.exe”软件?
非常感谢任何帮助/指导。
【问题讨论】:
-
参见 MSDN 上的 Process Enumeration 和 Enumerating All Processes。但就个人而言,我会枚举窗口,而不是枚举进程,只要确保水果窗口有一个唯一且一致的类名而不是标题,然后您可以使用
FindWindow/Ex()或GetClassName()来查找它们 -
@RemyLebeau 感谢您的帮助和链接。今天我将通读它们,看看我是否能理解它。谢谢:-)