admin 管理员组文章数量: 1132214
问题场景:近期项目中要解决元素坐标计算在桌面分辨率/缩放动态改变时有偏差的问题
测试猜想是动态改变分辨率/缩放之后坐标计算没有相应改变
之前计算dpi的方式为:
/// <summary>
/// 当前系统DPI_X 大小 一般为96
/// </summary>
public static int DpiX
{
get
{
IntPtr hdc = GetDC(IntPtr.Zero);
int DpiX = GetDeviceCaps(hdc, LOGPIXELSX);
ReleaseDC(IntPtr.Zero, hdc);
return DpiX;
}
}
该方式能得出屏幕dpi但是设置屏幕缩放改变之后,再次运行只会得到初始的dpi。即无法动态获取当前的dpi。
经过一番查找与跟同事交流得到两个可以动态获取dpi缩放的方式。
1.通过获取桌面的dpi,来确定为当前dpi。
/// <summary>
/// 获取动态的系统DPI_X 大小 防止分辨率改变后拿不到实际改变之后的dpi
/// </summary>
public static int DynamicDpiX
{
get
{
IntPtr hd1 = FindWindow("Progman", "Program Manager");
int DpiX = GetDpiForWindow(hd1);
return DpiX;
}
}
该方法获取桌面的句柄,然后调用API GetDpiForWindow 来获取当前桌面的dpi。经过测试,满足动态获取的要求。 但是需要注意一点,有的用户电脑,桌面的class Name可能不叫Progman, 而是WorkerW,所以可以加个对WorkerW的检测。
该方式是从网上一个C++解决方案改写的。关于动态获取系统DPI问题_Greless的后花园-CSDN博客1.获取系统DPI的方式有很多,但都有一个问题,获取的DPI可能回修改前的DPI#include <iostream> #include <Windows.h>#pragma comment(lib,"Gdi32.lib")#pragma comment(lib,"User32.lib")int main(void) {//HWND hd = GetDesktopWindow();HWND hd1 = FindWindow(NULL,L"Program Mhttps://blog.csdn/greless/article/details/115070716
2.另外跟同事交流获取另外一种解决方式:
/// <summary>
/// 获取宽度缩放百分比
/// </summary>
public static float ScaleX
{
get
{
IntPtr hdc = GetDC(IntPtr.Zero);
int t = GetDeviceCaps(hdc, DESKTOPHORZRES);
int d = GetDeviceCaps(hdc, HORZRES);
float ScaleX = ((float)t) / d;
ReleaseDC(IntPtr.Zero, hdc);
return ScaleX;
}
}
这种是获取缩放系数,即dpi/96.
原理是用可视桌面的像素(DESKTOPHORZRES)除以真实像素(HORZRES)来获得比例。
版权声明:本文标题:动态获取当前系统的缩放比例dpi(windows) 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.520sys.cn/xp/1765553712a1855406.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论