繁体   English   中英

如何获取打开的特定 window 的句柄?

[英]How do I get the handle of a particular window that's open?

首先,我对 C++ 的了解非常有限。

几年前,我设法拼凑了一些代码,这些代码读取了一些水果机仿真软件的 memory 区域。 它基于带有字母“DX”的水果机 window 标题工作。

我使用的代码如下:

    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...

当时有人告诉我,获得 window 句柄的更好方法是以下代码:

wchar_t process[] = L"MFME.exe";
DWORD pid= GetPID(process);
HANDLE phandle = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ, false, pid);

我没有更改我的代码,因为(当时)它适合我的目的。 我只是更改了我正在模拟的所有“水果机”,使其标题中包含文本“DX”,并且效果很好......

但是,我目前正在尝试向系统中添加超过 1,000 台水果机,如果有更强大的方法来获取 window 句柄,而无需更改每个 window 标题,那将容易得多。

我真的无法理解新代码,简单地复制/粘贴到我现有的代码中会导致 GetPID 未定义的错误,所以我想知道是否有人可以帮助我提供一个强大的解决方案来获取由“打开”的 window 的句柄MFME.exe”软件?

非常感谢任何帮助/指导。

要获得进程句柄(具有所需权限的进程句柄,而不是 window HWND 句柄),您可能需要以管理员身份运行程序。 如果您从 VS 调试器运行它,您还需要以管理员身份运行 VS 进程。

这是一些使用 CreateToolHelp32Snapshot 枚举进程以获取正确进程的代码。

#include <Windows.h>
#include <tlhelp32.h>

DWORD GetProcId(const char* procName)
{
    DWORD procId = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnap != INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32 procEntry;
        procEntry.dwSize = sizeof(procEntry);

        if (Process32First(hSnap, &procEntry))
        {
            do
            {
                if (!_stricmp(procEntry.szExeFile, procName))
                {
                    procId = procEntry.th32ProcessID;
                    break;
                }
            } while (Process32Next(hSnap, &procEntry));

        }
    }
    CloseHandle(hSnap);
    return procId;
}

int main()
{
    DWORD procId = GetProcId("MFME.exe");

    HANDLE hProc = 0;
    hProc = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ, false, procId);

    std::cout << std::hex << "0x" << hProc << std::endl;

    std::getchar();
    return 0;
}

这应该可以满足您的需求

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM