首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获得打开的特定窗口的句柄?

如何获得打开的特定窗口的句柄?
EN

Stack Overflow用户
提问于 2019-09-22 23:10:02
回答 1查看 44关注 0票数 0

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

几年前,我设法拼凑了一些代码,这些代码可以读取一些水果机器仿真软件的内存区域。它基于水果机窗口标题中的字母"DX“而工作。

我使用的代码如下:

代码语言:javascript
运行
复制
    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...

当时有人告诉我,获取窗口句柄的更好方法是下面的代码:

代码语言:javascript
运行
复制
wchar_t process[] = L"MFME.exe";
DWORD pid= GetPID(process);
HANDLE phandle = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ, false, pid);

我没有改变我的代码,因为(当时)它适合我的目的。我简单地更改了所有我正在模拟的“水果机器”,在它们的标题中有文本"DX“,它工作得很好……

然而,我目前正在尝试向系统中添加1000多台水果机,如果有一种更健壮的方法来获得窗口句柄,而不必更改每个窗口标题,那将会容易得多。

我真的不能理解新的代码,简单地复制/粘贴到我现有的代码中会导致GetPID未定义的错误,所以我想知道是否有人可以帮助我一个健壮的解决方案来获得"MFME.exe“软件打开的窗口的句柄?

非常感谢您的帮助/指导。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-15 14:20:19

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

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

代码语言:javascript
运行
复制
#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;
}

这应该可以满足您的需求

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58050521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档