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&lt;&lt; 是一个函数)。 您还应该使用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 &lt;&lt; 可能天知道错误代码是什么。

【讨论】:

@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)