Nếu bạn chỉ có HWND, hãy gọi GetWindowThreadProcessId để lấy PID từ một HWND đã cho. Sau đó, hãy gọi AttachConsole để đính kèm quy trình gọi của bạn vào bảng điều khiển của quá trình đã cho, sau đó gọi GetStdHandle để có được xử lý cho STDOUT của bảng điều khiển mới được đính kèm của bạn. Bây giờ bạn có thể gọi GetConsoleScreenBufferInfo bằng cách sử dụng tay cầm đó.
Nhớ dọn dẹp, giải phóng tay cầm của bạn với bảng điều khiển bằng cách gọi FreeConsole.
Sửa: Dưới đây là một số mã C++ để đi với bài mà
#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
}
}
Nguồn
2010-10-04 21:39:29
tôi nhận được một lỗi lạ trên attachconsole. lỗi # 31 - "Một thiết bị gắn vào hệ thống không hoạt động" – Cornwell
Theo msdn, nó không thành công vì quá trình này không tồn tại. Nhưng tôi kiểm tra pid và nó là chính xác. cả hai đều được tạo ra với cùng các đặc quyền. – Cornwell
Quá trình gọi đính kèm có thể cần chạy như quản trị viên. –