2010-10-04 156 views
5

如何獲取外部應用程序的控制檯句柄?獲取控制檯句柄

我有一個程序作爲控制檯運行。我有第二個程序將調用GetConsoleScreenBufferInfo,但爲此,我需要第一個程序的控制檯句柄。是否有可能給我的第一個程序的HWND我可以得到它的控制檯處理?

回答

5

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

我得到attachconsole一個奇怪的錯誤。錯誤#31 - 「連接到系統的設備無法正常工作」 – Cornwell 2010-10-04 22:31:12

+0

根據msdn,由於進程不存在而失敗。但我檢查了pid,它是正確的。他們都是用相同的特權創建的。 – Cornwell 2010-10-04 22:36:49

+0

進程調用attach可能需要以管理員身份運行。 – 2018-01-23 10:12:22