2010年2月23日 星期二

在WPF中取得螢幕的解析度

在WPF中有一個很簡單可以取得系統設定的類別
所以可以直接透過SystemParameters取得主螢幕的解析度

Size GetScreenResolution()
{
return new Size(
SystemParameters.PrimaryScreenWidth,
SystemParameters.PrimaryScreenHeight);
}

當然,如果是習慣使用Win32的程式設計師
也一樣可以用GetSystemMetrics來取得

const int SM_CXSCREEN = 0;
const int SM_CYSCREEN = 1;

[DllImport("user32.dll")]
static extern int GetSystemMetrics(int nIndex);

Size GetScreenResolution()
{
return new Size(
GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN));
}

此時要注意DPI的設定,在非預設的DPI(96)下
由於WPF的特性,這兩種方法取出的數值會不同
例如同樣在1920x1080的解析度下
DPI 設定SystemParametersGetSystemMetrics
100% (96)1920x10801920x1080
125% (120)1536x8641920x1080
150% (144)1280x7201920x1080

這樣彷彿使用GetSystemMetrics比較一致
但在WPF中,視窗相對位置會使用SystemParameters的解析度來算
也就是一個最大化的視窗,在滑鼠事件中取得右下角座標時
會取得SystemParameters的大小
所以還是需要依照使用的需求而選用
有關DPI的設定可以參考在WPF中取得DPI的設定DPI Virtualization

--
參考資料
SystemParameters 類別
GetSystemMetrics Function

沒有留言:

張貼留言