2010-10-04 5 views
5

Wie erhalte ich die Konsole Griff einer externen Anwendung?Get Konsole Griff

Ich habe ein Programm läuft als Konsole. Ich habe ein zweites Programm, das GetConsoleScreenBufferInfo nennen, aber dafür brauche ich die Konsole Griff des ersten Programms. Ist es möglich, dass ich das HWND des 1. Programms bekomme, das ich an die Konsole bekomme?

Antwort

5

Wenn Sie nur einen HWND haben, GetWindowThreadProcessId nennen eine PID aus einem gegebenen HWND zu erhalten. Rufen Sie anschließend AttachConsole an, um den aufrufenden Prozess an die Konsole des angegebenen Prozesses anzuhängen, und rufen Sie dann GetStdHandle an, um ein Handle für STDOUT Ihrer neu angeschlossenen Konsole zu erhalten. Sie können jetzt anrufen GetConsoleScreenBufferInfo, dass Griff verwenden.

Denken Sie daran, zu bereinigen, Ihren Griff in die Konsole zu befreien von FreeConsole aufrufen.

bearbeitet: Hier ist einig C++ Code mit diesem Beitrag zu gehen

#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

ich einen seltsamen Fehler auf attachconsole bekommen. Fehler # 31 - "Ein an das System angeschlossenes Gerät funktioniert nicht" – Cornwell

+0

Nach msdn schlägt es fehl, weil der Prozess nicht existiert. Aber ich überprüfe das Pid und es ist korrekt. Sie wurden beide mit den gleichen Privilegien erstellt. – Cornwell

+0

Process Calling Attach muss wahrscheinlich als Admin ausgeführt werden. –