【发布时间】:2021-03-16 01:31:49
【问题描述】:
当我尝试使用 GetWindowThreadProcessId 函数时,它会失败并使用 GetLastError 函数并将其转换为字符串时显示“参数不正确”。它发现窗口很好,我尝试将 HWND 参数更改为打开的 .txt 文件,它似乎工作正常,所以我认为问题出在命令行而不是其他问题。这是我的代码:
HWND win = FindWindowA(NULL, (LPCSTR)"C:\\WINDOWS\\system32\\cmd.exe");
LPSTR str;
str = new CHAR[50];
GetWindowTextA(win, str, 49);
cout << str;
LPDWORD * pid;
pid = new LPDWORD();
DWORD cmdthread = GetWindowThreadProcessId(win, *pid);
cout << GetLastErrorAsString();
它似乎适用于任何非 Windows 命令提示符,但我需要使用命令提示符。有什么解决办法还是我做错了什么?
【问题讨论】:
-
再看看documentation。您的论点根本不是文档所描述的(或者我记错了 cmd 用来放在其标题中的内容)。此外,演员表非常可疑,因为在这种情况下它是多余的,并且可能会根据您的演员表造成积极的伤害。在这段代码中也没有明显的理由使用
newing 指针——您可以获得指向堆栈变量的指针。事实上,newing 以这种方式指向指针会给您带来额外的问题,否则这些问题不会出现。 -
答案是我会选择的,但总的来说,我真正推荐的是在深入研究之前从 good book 学习 C++(也足以了解 C 方面的内容)进入 Windows API,因为围绕语言概念的混淆将使 API 比现在更难使用。在启用编译器的清理程序的情况下进行编译也很有用,因为这种类型的代码很容易出错,尤其是在早期,并且会捕获一些内存错误等。
-
对于 Windows API,Charles Petzold 的 Programming Windows 非常流行,以提供一般知识。但是,如果我没记错的话,最好在熟悉 C 时阅读。尤其是这些 API 与时间一样古老,而且 Windows 的向后兼容性故事意味着他的旧书在直接使用旧 API 时仍然适用。
-
非常感谢您的帮助。这些书肯定会帮助我:p
-
你应该只使用
GetLastErrorAsString()的结果如果有错误。如果没有,你只能得到它的previous i> 错误,或 API 可能在内部生成的错误。