2009-08-26 67 views
2

在我的申請,我得到的屏幕分辨率與此代碼:航空是否操縱DPI和屏幕尺寸?爲什麼?

SystemInformation.PrimaryMonitorSize 

我也得到了DPI與此代碼:

using (Graphics g = Graphics.FromHdc(NativeMethods.GetDC(IntPtr.Zero))) 
    { 
     dpiX = g.DpiX; 
     dpiY = g.DpiY; 
    } 

這在大多數情況下的罰款。但是,當代碼在開啓Aero的Vista計算機上運行時,並且用戶已將顯示器設置爲使用高DPI時,奇怪的結果會回來。

比方說用戶已經將設備設定爲以1024 x 768運行,並具有DPI在144,上面的代碼將返回的683×512的分辨率和96

一個DPI然而,如果航空被關閉,結果回來,因爲我期望他們。 Aero正在做什麼,如何才能獲得真正的解決方案和DPI?

回答

7

您需要declare your application as DPI-aware,無論是在清單(首選),或通過使用Win32 API函數SetProcessDPIAware。由於許多應用程序編寫不當,Vista添加了「DPI虛擬化」,它允許應用程序假裝他們正在使用「標準」96dpi屏幕,然後進行縮放 - DWM作爲合成窗口管理器可以執行縮放。如果您的應用程序正確處理不同的DPI,則必須明確地說。

在附註中,您不應該使用HWND_DESKTOP(這是(HWND)0是什麼)。當合成(「Aero」)關閉時,它確實代表了物理屏幕,所以如果您獲得DC並繪製它,則可以直接繪製到幀緩衝區中。使用合成窗口管理器,這是不可能的by definition。我不知道這是否會影響DPI的測量,但它可能是一個更好的主意,用直流您的應用程序窗口,而不是無論如何 - 它不會傷害/

+0

+1這是完全正確的。微軟放棄了試圖懇求開發人員使其應用程序在96dpi以外的dpi設置下正常工作。如果用戶選擇高分辨率,大多數應用程序不會被破壞,開發人員現在已經表明它們支持高dpi。用戶仍然可以禁用每個程序的縮放比例(右鍵單擊,兼容性選項卡) – 2009-12-04 16:38:34