Снимок экрана на машинах с высоким разрешением - PullRequest
1 голос
/ 29 марта 2019

Я использую следующий код для захвата скриншота рабочего стола. Он отлично работает на обычных машинах 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...