Получить дескриптор консоли - PullRequest
5 голосов
/ 05 октября 2010

Как получить дескриптор консоли внешнего приложения?

У меня есть программа, работающая как консоль. У меня есть вторая программа, которая будет вызывать GetConsoleScreenBufferInfo, но для этого мне нужен дескриптор консоли первой программы. Возможно ли, что, учитывая HWND 1-й программы, я могу получить ее дескриптор консоли?

1 Ответ

6 голосов
/ 05 октября 2010

Если у вас есть только HWND, вызовите GetWindowThreadProcessId , чтобы получить PID из данного HWND.После этого вызовите AttachConsole , чтобы присоединить ваш вызывающий процесс к консоли данного процесса, затем вызовите GetStdHandle , чтобы получить дескриптор STDOUT вашей недавно подключенной консоли.Теперь вы можете вызвать GetConsoleScreenBufferInfo , используя этот дескриптор.

Не забудьте очистить, освободив свой дескриптор для консоли, вызвав FreeConsole.

Edit : Здесьнекоторый код на 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   
    }   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...