【问题标题】:GetLastError() returns 0 to a Failed Window HandleGetLastError() 将 0 返回到失败的窗口句柄
【发布时间】: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),但它们并没有真正说同样的话。)

标签: c++ windows


【解决方案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() 是错误的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 2013-04-24
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多