コンピュータに接続されたディスプレイに十分な情報が含まれているEDIDを使用して最終的にそうする方法を見つけました。EDIDは、レジストリに格納されています。
public class CmToPixelConverter : IValueConverter
{
double ratio = DisplayHelper.GetCmToPixelRatio();
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (double)value * ratio;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
:ここ
HKLM\SYSTEM\CurrentControlSet\Enum\\DISPLAY\ + displayId + registryId
は、私は私のコンバーターを作成したことを使って、画面上のピクセルにCMを変換する割合を取得するためのコード
public static double GetCmToPixelRatio()
{
var diagVector = GetActiveDisplayDiag();
var width = System.Windows.SystemParameters.PrimaryScreenWidth;
return width/diagVector.X;
}
public static int GetDPIX()
{
var dpiXProperty = typeof(SystemParameters).GetProperty("DpiX", BindingFlags.NonPublic | BindingFlags.Static);
return (int)dpiXProperty.GetValue(null, null);
}
private static Point GetActiveDisplayDiag()
{
//get active display
string wmiQuery = string.Format("Select * from Win32_DesktopMonitor");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmiQuery);
ManagementObjectCollection retObjectCollection = searcher.Get();
foreach (ManagementObject retObject in retObjectCollection)
{
try
{
//get display id
string regPath = (string)retObject.GetPropertyValue("PNPDeviceID");
if (regPath != null)
{
var pathInfo = regPath.Split('\\');
var displayId = pathInfo[1];
RegistryKey reg = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\Enum\\DISPLAY\\" + displayId);
var firstSubReg = reg.GetSubKeyNames()[0];
reg = reg.OpenSubKey(firstSubReg + "\\Device Parameters");
var edid = (byte[])reg.GetValue("EDID");
return new Point(edid[21], edid[22]);
}
}
catch (Exception) { }
}
return new Point();
}
です
GUIコンポーネントのサイズを、モニターまで配置されたルーラーによって測定されたセンチメートルにしたい場合は、残念ながら実行できません。 – keith
この場合、修飾されたdoubleの目的は何ですか:Width = "20cm"? @ keith –
WPFは現在のDPI(dots per inch)を使ってcmをピクセルに変換すると思います。主な問題は、コンピュータ画面上のDPIは、プリンタのような物理的な手段ではないということです。 DPIの背後にあるコンピュータディスプレイの歴史を訴える価値があるかもしれません。 – keith