首页 > 解决方案 > FindWindowA() 返回 0,当我使用 GetLastError() 检查错误代码时,它也是 0 (ERROR_SUCCESS)

问题描述

这是我正在编写的 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;
    }

这是输出:

Couldn't find window named "notepad.exe": error-0

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

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

标签: c++cwindowswinapi

解决方案


错误很可能在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;
    }

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

但不成功的真正原因FindWindow是它不是在寻找进程名称,而是在寻找类似的窗口标题Untitled - Notepad

否则,如果FindWindow没有找到该窗口,则不管 Microsoft 文档如何伪装,最后一个错误实际上都没有设置。

结论

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


推荐阅读