c++ - 获取控制台句柄

标签 c++ c winapi

如何获取外部应用程序的控制台句柄?

我有一个作为控制台运行的程序。我有一个将调用 GetConsoleScreenBufferInfo 的第二个程序,但为此我需要第一个程序的控制台句柄。是否有可能给出第一个程序的 HWND 我可以获得它的控制台句柄?

最佳答案

如果您只有 HWND,请调用 GetWindowThreadProcessId从给定的 HWND 获取 PID。之后,调用AttachConsole将调用进程附加到给定进程的控制台,然后调用 GetStdHandle获取新连接的控制台的 STDOUT 句柄。您现在可以调用 GetConsoleScreenBufferInfo使用那个句柄。

记得清理,通过调用 FreeConsole 释放控制台的句柄。

编辑:这是该帖子的一些 C++ 代码

#include <sstream>
#include <windows.h>

// ...
// assuming hwnd contains the HWND to your target window    

if (IsWindow(hwnd))
{
    DWORD process_id = 0;
    GetWindowThreadProcessId(hwnd, &process_id);
    if (AttachConsole(process_id))
    {
        HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
        if (hStdOut != NULL)
        {
            CONSOLE_SCREEN_BUFFER_INFO console_buffer_info = {0};
            if (GetConsoleScreenBufferInfo(hStdOut, &console_buffer_info))
            {
                std::stringstream cursor_coordinates;
                cursor_coordinates << console_buffer_info.dwCursorPosition.X << ", " << console_buffer_info.dwCursorPosition.Y;
                MessageBox(HWND_DESKTOP, cursor_coordinates.str().c_str(), "Cursor Coordinates:", MB_OK);
            }
        }
        else
        {
            // error handling   
        }   
        FreeConsole();   
    }
    else
    {
        // error handling   
    }   
}

关于c++ - 获取控制台句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3859276/

相关文章:

c++ - 旋转 CImage 并保留其 alpha/透明 channel

c++ - 我的代码是否等同于 Boost.Asio 教程中给出的代码?

c++ - 重复任务 100 次

c - 在关键代码上使用互斥锁

c++ - Direct Show graph - 如何获取当前的 fps?

c++ - 使用带有初始化列表的 Stroustrup 的 PPP 书中的 vector 时出现编译错误

c++ - 是否可以测试 constexpr 函数是否在编译时进行评估?

c - 如何在 C 中表示内存中的 FLOAT 数

windows - 如何使用 Windows API 从麦克风录制 wav 声音?

c++ - 将 OLECHAR* 转换为 CHAR* 以构建 string()