C# 高DPI机器上的屏幕截图
我使用以下代码捕获桌面截图。它在普通DPI机器上运行良好。但对于DPI设置高于正常值的机器,部分屏幕不会显示在捕获图像中 经过一点研究,我知道我需要在应用程序清单文件中添加以下设置 遵循此链接中指定的步骤 但问题依然存在。高DPI机器上的捕获屏幕不正确 请引导我。还需要做些什么来克服这个问题C# 高DPI机器上的屏幕截图,c#,screenshot,highdpi,C#,Screenshot,Highdpi,我使用以下代码捕获桌面截图。它在普通DPI机器上运行良好。但对于DPI设置高于正常值的机器,部分屏幕不会显示在捕获图像中 经过一点研究,我知道我需要在应用程序清单文件中添加以下设置 遵循此链接中指定的步骤 但问题依然存在。高DPI机器上的捕获屏幕不正确 请引导我。还需要做些什么来克服这个问题 <asmv3:application xmlns="urn:schemas-microsoft-com:asm.v3"> <asmv3:windowsSettings>
<asmv3:application xmlns="urn:schemas-microsoft-com:asm.v3">
<asmv3:windowsSettings>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
static Bitmap CaptureDesktop()
{
SIZE size;
Bitmap printscreen = null;
size.cx = Win32Stuff.GetSystemMetrics
(Win32Stuff.SM_CXSCREEN);
size.cy = Win32Stuff.GetSystemMetrics
(Win32Stuff.SM_CYSCREEN);
int width = size.cx; int height = size.cy;
IntPtr hWnd = Win32Stuff.GetDesktopWindow();
IntPtr hDC = Win32Stuff.GetDC(hWnd);
if (hDC != IntPtr.Zero)
{
IntPtr hMemDC = GDIStuff.CreateCompatibleDC(hDC);
if (hMemDC != IntPtr.Zero)
{
IntPtr m_HBitmap = GDIStuff.CreateCompatibleBitmap(hDC, width, height);
if (m_HBitmap != IntPtr.Zero)
{
IntPtr hOld = (IntPtr)GDIStuff.SelectObject(hMemDC, m_HBitmap);
GDIStuff.BitBlt(hMemDC, 0, 0, width, height, hDC, 0, 0, GDIStuff.SRCCOPY);
GDIStuff.SelectObject(hMemDC, hOld);
GDIStuff.DeleteDC(hMemDC);
printscreen = System.Drawing.Image.FromHbitmap(m_HBitmap);
GDIStuff.DeleteObject(m_HBitmap);
}
}
}
Win32Stuff.ReleaseDC(hWnd, hDC);
return printscreen;
}
PerMonitorV2
真的
静态位图CaptureDesktop()
{
大小;
位图打印屏幕=空;
size.cx=Win32Stuff.GetSystemMetrics
(Win32Stuff.SM_CXSCREEN);
size.cy=Win32Stuff.GetSystemMetrics
(Win32Stuff.SM_CYSCREEN);
内部宽度=size.cx;内部高度=size.cy;
IntPtr hWnd=Win32Stuff.GetDesktopWindow();
IntPtr hDC=Win32Stuff.GetDC(hWnd);
如果(hDC!=IntPtr.Zero)
{
IntPtr hMemDC=gdistruff.CreateCompatibleDC(hDC);
如果(hMemDC!=IntPtr.Zero)
{
IntPtr m_HBitmap=GDIStuff.CreateCompatibleBitmap(hDC、宽度、高度);
如果(m_HBitmap!=IntPtr.Zero)
{
IntPtr hOld=(IntPtr)gdistruff.SelectObject(hMemDC,m_HBitmap);
BitBlt(hMemDC,0,0,宽度,高度,hDC,0,0,gdistruff.SRCCOPY);
gdistruff.SelectObject(hMemDC,保持);
gdistruff.DeleteDC(hMemDC);
printscreen=System.Drawing.Image.FromHbitmap(m_HBitmap);
gdistruff.DeleteObject(m_HBitmap);
}
}
}
Win32Stuff.ReleaseDC(hWnd,hDC);
返回打印屏幕;
}
这里有一个设置DPI感知的示例,它与您的不同-您在没有asmv3的情况下尝试了,但效果相同。我不明白怎么回事。考虑到缩放比例,我需要实际计算高度和宽度吗?有一个设置DPI感知的例子,它与您的不同-您尝试了没有asmv3的,但效果相同。我不明白怎么回事。考虑到缩放比例,我是否需要实用地计算高度、宽度?