FindWindowA() 返回 0,当我使用 GetLastError() 检查错误代码时,它也是 0 (ERROR_SUCCESS)

Gil*_*Raz 1 c c++ windows winapi

这是我正在编写的 dll 注入代码中的一段。我正在使用FindWindowA() 中定义的窗口过程获取 HWND INJ_PROC_NAME。问题是该函数总是返回 0,当我用GetLastError()它检查错误时也返回 0。我不知道是什么问题,因为错误代码没有给我关于错误的正确信息。

HWND Hwnd = FindWindowA(NULL, INJ_PROC_NAME);
    if (Hwnd == NULL)
    {
        std::cout << "Couldn't find window named \"" << INJ_PROC_NAME << "\": error-"
            << GetLastError() << std::endl;
        getchar();
        return -1;
    }
Run Code Online (Sandbox Code Playgroud)

这是输出:

Couldn't find window named "notepad.exe": error-0
Run Code Online (Sandbox Code Playgroud)

这是一个已知的问题?我无法在 Microsoft 的文档或堆栈溢出中找到有关它的任何信息。我就是想不通这个...

编辑:显然,当我运行程序时,记事本是打开的。

Jab*_*cky 5

错误很可能在std::cout.

尝试这个:

 if (Hwnd == NULL)
    {
        DWORD error = GetLastError();  // first thing we retrieve the error

        std::cout << "Couldn't find window named \"" << INJ_PROC_NAME << "\": error-"
            << error << std::endl;
        getchar();
        return -1;
    }
Run Code Online (Sandbox Code Playgroud)

无论如何必须在失败后立即保存错误编号,如上所示。

但是,真正的原因FindWindow没有成功,是因为它是不是找的进程名,但对窗口标题是类似Untitled - Notepad

否则,如果FindWindow没有找到窗口,尽管 Microsoft 文档假装是什么,最后一个错误实际上没有设置。

结论

使用FindWindow可能不是最好的方法,您应该按照Microsoft 文档 中的描述枚举进程。

  • 特别要注意的是,尽管调用线程的最后一个错误代码有多次机会更改,直到它被发现为止,但观察到的行为是可以预料的:不存在具有该窗口名称的窗口。API 返回一个“nullptr”,“GetLastError”返回“ERROR_SUCCESS”以表明“FindWindow”的返回值不是错误的结果。 (3认同)