【问题标题】:Why doesn't the GetWindowThreadProcessId function work with the command line?为什么 GetWindowThreadProcessId 函数不能与命令行一起使用?
【发布时间】: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 可能在内部生成的错误。

标签: c++ windows process


【解决方案1】:

您将无效的DWORD* 指针传递给GetWindowThreadProcessId() 的第二个参数。试试这个:

HWND win = FindWindowA(NULL, "C:\\WINDOWS\\system32\\cmd.exe");
if (win != NULL)
{
    // this part is redundant, since you just did a search for
    // the HWND by its window text, so you already know what
    // the text is...
    char str[50] = {};
    GetWindowTextA(win, str, 49);
    cout << str;
    //

    DWORD pid = 0;
    DWORD tid = GetWindowThreadProcessId(win, &pid);
    if (tid != 0)
        cout << "Thread ID: " << tid << " Process ID: " << pid;
    else
        cout << GetLastErrorAsString();
}

【讨论】:

  • 这似乎行得通。但是,当我尝试将其附加到主线程时,它会失败并出现相同的错误: AttachThreadInput(mainthread, tid, true);
  • 如果AttachThreadInput() 失败,GetLastError() 会报告什么?请注意,documentation 确实表示您不能将系统线程附加到另一个线程,或者将另一个线程附加到系统线程。命令窗口是一个系统组件,因此可能不允许您附加到它。另一方面,如果目标线程根本没有要附加的消息队列,AttachThreadInput() 也可能会失败。
  • 它说“参数不正确”我阅读了很多这些东西的文档,但找不到什么是/不是系统线程,但如果命令提示符是我猜我运气不好。您知道是否有任何方法可以同时运行命令提示符并关闭特定的命令提示符?这就是这里的目标。
猜你喜欢
  • 1970-01-01
  • 2020-01-20
  • 2023-03-13
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
相关资源
最近更新 更多