问题
在windows 8.1(和更新版本)上,DPI设置是每个显示器。我可以在系统设置中清楚地看到我的主显示器(笔记本电脑)设置为125%dpi,而我的备用显示器设置为100%dpi。我的应用程序完全是用C#编写的,而我尝试过的每个API调用都会导致辅助监视器的DPI不正确。请记住,那我打电话,我处理的初始化这种方法,并已在我的清单中指定的DPI意识到:检索辅助监视器DPI的正确方法是什么?
(shcore.dll)
SetProcessDpiAwareness(PROCESS_DPI_AWARENESS::PROCESS_PER_MONITOR_DPI_AWARE);
尝试
(shcore.dll)
GetDpiForMonitor(hMonitor, MONITOR_DPI_TYPE::MDT_EFFECTIVE_DPI, &dpiX, &dpiY)
(导致120无论HMONITOR手柄)
(user32.dll)
IntPtr dC = CreateDC(...);
double logX = (double)GetDeviceCaps(dC, LOGPIXELSX);
double logY = (double)GetDeviceCaps(dC, LOGPIXELSY);
(结果120而不考虑的CreateDC设备名称的)
显示器布局
,严重混淆了我,是第一显示器是矩形{0,0,1920,1080}
但第二个显示器是{2400,0,2400,1350}
,基本上使得{4800x1350}
一个实际的桌面大小和{3840x1080}
虚拟桌面大小的另一件事,但是显示器之间缺少像素,我无法解释并且我不明白。
Screen 1 Screen 2
Actual Pixels: 1920x1080 2400x1350
Virtual Pixels: 1536x864 1920x1080
Top-Left Coord: 0x0 2400x0
Actual DPI: 120 (125%) 96 (100%)
Returned DPI: 120 (125%) 120 (125%)
的另一种方式,我可以确认的是,显示器不同的DPI,是拖整个显示器之间的边界的任何DPI感知应用程序的中心点会导致窗口来改变它的大小是整个显示器一致( WPF默认是这样做的)。