c++ - 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 的文档或堆栈溢出中找到有关它的任何信息。我就是想不通这个...
编辑:显然,当我运行程序时,记事本是打开的。
解决方案
错误很可能在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 文档中的描述枚举流程。
推荐阅读
- libreoffice - 如何将数据复制到单元格中,制作表格并向其中添加更多数据
- algorithm - 图中最有利的路径(但不是最短的)
- c - 不知道打印结果句时如何让随机数0,1,2显示为rock, paper, and sissors
- azure - 从 Azure 数据流中的变量运行源 SQL 时出现解析错误
- c - C的格式说明符问题
- assembly - 如何在emu8086中不使用减法或加法将小写转换为大写,反之亦然
- c# - ReSharper ContractAnnotation for Null Check + Out Variable 给出反直觉的结果
- flutter - Flutter:使用 InterstitialAd 时,该库禁用了 Null 安全功能?_interstitialAd;
- javascript - 如果函数在 1 秒内被调用 50 次,则只运行一次
- react-native - React Native codeigniter api无法从axios / async await读取数据