这是我正在编写的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文档中的所述枚举流程。