C# 高DPI机器上的屏幕截图

C# 高DPI机器上的屏幕截图,c#,screenshot,highdpi,C#,Screenshot,Highdpi,我使用以下代码捕获桌面截图。它在普通DPI机器上运行良好。但对于DPI设置高于正常值的机器,部分屏幕不会显示在捕获图像中 经过一点研究,我知道我需要在应用程序清单文件中添加以下设置 遵循此链接中指定的步骤 但问题依然存在。高DPI机器上的捕获屏幕不正确 请引导我。还需要做些什么来克服这个问题 <asmv3:application xmlns="urn:schemas-microsoft-com:asm.v3"> <asmv3:windowsSettings>

我使用以下代码捕获桌面截图。它在普通DPI机器上运行良好。但对于DPI设置高于正常值的机器,部分屏幕不会显示在捕获图像中

经过一点研究,我知道我需要在应用程序清单文件中添加以下设置

遵循此链接中指定的步骤

但问题依然存在。高DPI机器上的捕获屏幕不正确

请引导我。还需要做些什么来克服这个问题

<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的
,但效果相同。我不明白怎么回事。考虑到缩放比例,我是否需要实用地计算高度、宽度?