5
如何獲取外部應用程序的控制檯句柄?獲取控制檯句柄
我有一個程序作爲控制檯運行。我有第二個程序將調用GetConsoleScreenBufferInfo,但爲此,我需要第一個程序的控制檯句柄。是否有可能給我的第一個程序的HWND我可以得到它的控制檯處理?
如何獲取外部應用程序的控制檯句柄?獲取控制檯句柄
我有一個程序作爲控制檯運行。我有第二個程序將調用GetConsoleScreenBufferInfo,但爲此,我需要第一個程序的控制檯句柄。是否有可能給我的第一個程序的HWND我可以得到它的控制檯處理?
如果您只有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
}
}
我得到attachconsole一個奇怪的錯誤。錯誤#31 - 「連接到系統的設備無法正常工作」 – Cornwell 2010-10-04 22:31:12
根據msdn,由於進程不存在而失敗。但我檢查了pid,它是正確的。他們都是用相同的特權創建的。 – Cornwell 2010-10-04 22:36:49
進程調用attach可能需要以管理員身份運行。 – 2018-01-23 10:12:22