FindWindow() 失败,但 GetLastError 返回 0
Posted
技术标签:
【中文标题】FindWindow() 失败,但 GetLastError 返回 0【英文标题】:FindWindow() fails, but GetLastError returns 0 【发布时间】:2020-08-20 20:20:35 【问题描述】:最近,我决定在自己制作的一个小应用程序中改进错误处理;为了测试我的功能,我尝试通过给FindWindow
提供一个错误的窗口名称来引入一个基本错误。错误被成功捕获,但我的错误函数告诉我,GetLastError
给出的最后一个错误是 0。
我尝试在程序的其他部分引入错误,所有这些都被捕获,并给出了某种实际的错误代码。当将真实的窗口名称传递给FindWindow
时,该函数完美运行。
我创建了一个独立的测试,以查看我的程序中是否有其他问题导致了问题,您可以在此处查看;
#include <iostream>
#include <windows.h>
using namespace std;
int main()
wstring wstr = L"asdasdasd";
wcout << wstr << endl;
HWND hwnd = FindWindow(NULL, wstr.c_str());
if (hwnd == NULL)
cout << "Window not found" << endl;
cout << GetLastError();
return 0;
显然,不存在称为“asdasdasd”的窗口。并且测试证实了这一点,运行代码给出:
asdasdasd //wstring created correctly
Window not found //Output of FindWindow() is NULL
0 //GetLastError() is 0
(测试后添加评论)
FindWindowA
的 Windows API 文档内容如下:
如果函数成功,则返回值是具有指定类名和窗口名的窗口句柄。
如果函数失败,返回值为NULL。要获取扩展的错误信息,请调用 GetLastError。"
所以我不应该从GetLastError
收到错误代码吗?有没有我遇到的边缘情况不会发生?
任何帮助将不胜感激。
【问题讨论】:
评论不用于扩展讨论;这个对话是moved to chat。 【参考方案1】:cmets 的共识似乎是 FindWindow
如果没有找到窗口,则根本不会设置错误(尽管我测试过其他错误)。就个人而言,这似乎是非常具有误导性的文档,尤其是当 Windows api 中的其他功能无法完成工作时,即使没有发生实际错误,也会设置错误代码,但我离题了。
【讨论】:
函数调用FindWindow
。找不到窗口是成功的结果。为什么您希望 API 调用设置线程的最后一个错误代码(无论如何您都没有正确评估)?
如果您发现文档具有误导性 suggest an edit.
@IInspectable 因为在文档的 Return 部分,它明确指出它将返回一个窗口句柄,成功时返回 NULL,失败时您可以调用 GetLastError
获取扩展信息。我希望有关失败的更多信息能够告诉我,确切地说,而不是函数成功。
@IInspectable 我理解你的逻辑,我只是认为文档给出的想法是,如果函数返回 NULL,你可以期待 GetLastError
给你更多信息,这通常意味着错误代码比 0。感谢您提供链接,但我会考虑提出请求,但老实说,我并没有真正看到它被批准。
GetLastError
确实提供了更多信息。如果它返回ERROR_SUCCESS
,这意味着您没有找到给定谓词的窗口,这不是 API 内部试图找到答案的错误的结果。至于提出更改 API 文档的请求,我的经验是 没有 被拒绝。以上是关于FindWindow() 失败,但 GetLastError 返回 0的主要内容,如果未能解决你的问题,请参考以下文章