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的主要内容,如果未能解决你的问题,请参考以下文章

FindWindow函数执行失败,无法找到窗口句柄

窗口类释放问题

GetLastError() 将 0 返回到失败的窗口句柄

为啥 fusedLocationProviderClient.getLast 位置总是返回 null?

C语言FindWindow和SetFocus的问题

kafkakafka NoSuchElementException ArrayDeque getLast