2010-10-04 7 views
5

Come si ottiene l'handle di console di un'applicazione esterna?Ottenere l'handle di console

Ho un programma in esecuzione come console. Ho un secondo programma che chiamerà GetConsoleScreenBufferInfo, ma per quello ho bisogno dell'handle della console del primo programma. È possibile che dato l'HWND del 1 ° programma posso ottenere la sua console?

risposta

5

Se si dispone solo di un HWND, chiamare GetWindowThreadProcessId per ottenere un PID da un determinato HWND. Successivamente, chiamare il numero AttachConsole per allegare il processo di chiamata alla console del processo specificato, quindi chiamare GetStdHandle per ottenere un handle per STDOUT della console appena collegata. È ora possibile chiamare GetConsoleScreenBufferInfo utilizzando tale maniglia.

Ricordarsi di eseguire la pulizia, liberando l'handle dalla console chiamando FreeConsole.

Edit: Ecco il codice C++ di andare con quel post

#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

ottengo un errore di strano su di attachconsole. errore # 31 - "Un dispositivo collegato al sistema non funziona" – Cornwell

+0

Secondo msdn, fallisce perché il processo non esiste. Ma controllo il pid ed è corretto. sono stati entrambi creati con gli stessi privilegi. – Cornwell

+0

Il processo di chiamata attach probabilmente deve essere eseguito come amministratore. –

Problemi correlati