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



这是我正在编写的dll注入代码的一段。我使用FindWindowA()来获得在INJ_PROC_NAME中定义的窗口进程的HWND。问题是函数总是返回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

这是一个已知的问题吗?我在微软的文档或堆栈溢出中找不到任何关于它的信息。我就是想不通这个。。。

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

该错误很可能在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文档中的所述枚举流程。

相关内容