2010-10-04 3 views
5

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

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

ответ

5

Если у вас есть только 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 
    } 
} 
+0

Я получаю странные ошибки на AttachConsole. ошибка № 31 - «Устройство, подключенное к системе, не работает» – Cornwell

+0

Согласно msdn, он терпит неудачу, потому что процесс не существует. Но я проверяю pid, и это правильно. они были созданы с теми же привилегиями. – Cornwell

+0

Процесс вызова приложения, вероятно, нужно запустить как admin. –

Смежные вопросы