GetLastError() 将 0 返回到失败的窗口句柄
Posted
技术标签:
【中文标题】GetLastError() 将 0 返回到失败的窗口句柄【英文标题】:GetLastError() returns 0 to a Failed Window Handle 【发布时间】:2019-12-13 11:03:56 【问题描述】:我制作了一个访问游戏的程序。
我的程序正在寻找带有FindWindow
函数的游戏窗口,如果FindWindow
失败,程序会打印一条错误消息。
我的问题是 GetLastError
函数总是返回 0。
("操作成功完成。")
为什么总是返回 0?示例:
#include <iostream>
#include <Windows.h>
void GameAccess(LPCSTR winname)
HWND GameWindow = FindWindowA(NULL, winname);
if (GameWindow == FALSE)
std::cout << "Failed to FindWindow & Error Code: " << GetLastError();
Sleep(3000);
exit(1);
else
DWORD procID;
GetWindowThreadProcessId(GameWindow, &procID);
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID);
if (procID == FALSE)
std::cout << "procID Failed & Error Code: " << GetLastError();
Sleep(3000);
exit(1);
int main()
GameAccess("myGame");
return 0;
【问题讨论】:
您在 Windows 95 上运行吗? @TanveerBadar 不,为什么? 与FindWindowEx()
相比,您为什么使用FindWindowA()
?除了扩展功能外,它还会根据您编译的字符集绑定到正确的字符集,从而为您处理 ASCII 与 Unicode。
您需要在调用任何其他函数之前检索最后一个错误(而operator<<
是一个函数)。
您还应该使用if (handle == NULL)
而不是if (procID == FALSE)
。 (我怀疑这些来自将非常常见的if (!x)
翻译成if (x == FALSE)
,但它们并没有真正说同样的话。)
【参考方案1】:
你想要这个:
HWND GameWindow = FindWindowA(NULL, winname);
if (GameWindow == NULL) // compare to NULL
auto errorcode = GetLastError(); // 1st thing to do
std::cout << "Failed to FindWindow & Error Code: " << errorcode;
Sleep(3000);
exit(1);
else
DWORD procID;
GetWindowThreadProcessId(GameWindow, &procID);
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID);
if (handle == NULL) // compare handle to NULL, not procID to FALSE
auto errorcode = GetLastError(); // 1st thing to do
std::cout << "procID Failed & Error Code: " << errorcode;
Sleep(3000);
exit(1);
如果 OpenProcess
返回的句柄在某些时候不为 NULL,您还需要关闭它。
std::cout <<
可能天知道错误代码是什么。
【讨论】:
@nakE 我可以重现这个。看起来微软文档是错误的。这不是第一次发生。顺便说一句,else
部分还有其他不相关的问题。
嘿!你编辑你的帖子了吗?你所说的“不相关的问题”是什么意思,你能解释一下吗?
@nakE 是的,我显然编辑了答案,查看else
部分和我添加的 cmets,并将其与您的原始代码进行比较。
你试过了吗?我仍然得到 0 作为错误代码。
@nakE 阅读了我的第一条评论。我也得到 0。我想微软文档关于 GetLastError()
是错误的。以上是关于GetLastError() 将 0 返回到失败的窗口句柄的主要内容,如果未能解决你的问题,请参考以下文章
FindWindow() 失败,但 GetLastError 返回 0
WTSQueryUserToken 失败,getlasterror() 返回 1723
WinInet::InternetSetOption(...) 总是返回 0 并且 GetLastError() 返回 12018
LoadImage() 返回 NULL 并且 GetLastError() 返回 0
GlobalAddAtom() 在 Win7 上返回 0 和 GetLastError = 0x5,适用于 XP
FindWindowA() 返回 0,当我使用 GetLastError() 检查错误代码时,它也是 0 (ERROR_SUCCESS)