获取控制台句柄

时间:2010-10-04 21:28:16

标签: c++ c winapi

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

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

1 个答案:

答案 0 :(得分:6)

如果您只有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   
    }   
}