2014-05-06 18 views
6

Tôi cần trợ giúp về cách truy xuất độ phân giải của màn hình, như minh họa trong hình bên dưới.Làm thế nào để có được kích thước (độ phân giải) của mỗi màn hình?

one 1680x1050, another 1366x768, and a third 1280x800

tôi thấy this documentation và nó đã thực sự hữu ích. Dưới đây là đoạn code mà tôi đã cố gắng, dựa trên những tài liệu:

int numberOfScreens = GetSystemMetrics(SM_CMONITORS); 
int width   = GetSystemMetrics(SM_CXSCREEN); 
int height   = GetSystemMetrics(SM_CYSCREEN); 

std::cout << "Number of monitors: " << numberOfScreens << "\n"; // returns 3 
std::cout << "Width:"    << width   << "\n"; 
std::cout << "Height:"    << height   << "\n"; 

Tuy nhiên, nó chỉ xác định và cung cấp thông tin về chính màn hình. Làm cách nào để nhận thông tin về các màn hình khác?

+1

Bạn có thể muốn đọc về [Enumeration và hiển thị Control] (http://msdn.microsoft.com/en- chúng tôi/thư viện/windows/desktop/dd162617% 28v = vs.85% 29.aspx). –

Trả lời

4
#include <Windows.h> 

BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor, 
           HDC  hdcMonitor, 
           LPRECT lprcMonitor, 
           LPARAM dwData) 
{ 
    MONITORINFO info; 
    info.cbSize = sizeof(info); 
    if (GetMonitorInfo(hMonitor, &info)) 
    { 
     std::cout << "Monitor x: "<< std::abs(info.rcMonitor.left - info.rcMonitor.right) 
        <<" y: "  << std::abs(info.rcMonitor.top - info.rcMonitor.bottom) 
        << std::endl; 
    } 
    return TRUE; // continue enumerating 
} 

int main() 
{ 
    EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, 0); 

    return 0; 
} 
+0

Cảm ơn. Đây là những gì tôi muốn. – benjtupas

2

Để liệt kê tất cả các thiết bị được kết nối với máy tính, hãy gọi số EnumDisplayDevices function và liệt kê thiết bị. Sau đó, gọi EnumDisplayMonitors. Điều này trả về một tay cầm cho mỗi màn hình (HMONITOR), được sử dụng với GetMonitorInfo.

Bạn cũng có thể sử dụng số điện thoại Win32_DesktopMonitor class của WMI, nếu hệ điều hành là Windows XP SP2 hoặc cao hơn (không thành công trong SP1).

Ngoài ra, bạn có thể thử sử dụng giá trị EDID từ sổ đăng ký để nhận kích thước, nhưng trong nhiều trường hợp, giá trị EDID không hợp lệ.

Registry đường

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Enum \ DISPLAY

+0

Tôi thích câu trả lời của bạn đã cố gắng giải thích * như thế nào, thay vì chỉ đăng tải một đoạn mã như tên khác. Nhưng tôi phải giải thích với giải pháp được đề xuất của bạn. Đâu là điểm gọi 'EnumDisplayDevices' trước, trước khi gọi' EnumDisplayMonitors'? Chỉ cần sau này là đủ ở đây, phải không? –

+0

Chỉ cần điều hướng đến đường dẫn đăng ký dưới đây HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Enum \ DISPLAY, nó sẽ hiển thị tất cả các thiết bị hiển thị được kết nối với hệ thống và sẽ có một mục nhập hợp lệ cho phiên hiện tại. Tương tự WMI cũng cung cấp nhiều hơn một kết quả cho các máy tính để bàn, một sẽ được mặc định và một sẽ là một hiện tại được sử dụng. Tôi không chắc chắn lý do tại sao chúng tôi nhận được nhiều màn hình nhất có lẽ nó có thể được theo dõi hồ sơ của số lượng màn hình kết nối cho đến ngày cho CPU – DNamto

+0

Có, nó theo dõi tất cả các màn hình đã được kết nối. Tôi có 15 mục nhập theo khóa sổ đăng ký đó. Không ai trong số này trả lời câu hỏi về lý do tại sao nó cần thiết để gọi 'EnumDisplayDevices', trái ngược với chỉ đơn giản là gọi' EnumDisplayMonitors'. –

Các vấn đề liên quan