Программа Screen Capture копирует больше выбранной области - PullRequest
0 голосов
/ 18 декабря 2018

Я следовал программе Хью Коллингборна в создании программы захвата экрана с C #.Тем не менее, я заметил несколько странных вещей, и я использую его созданную или измененную программу.В частности, я создал программу, которая открывает окно, которое позволяет вам захватить область.Я думаю, что это связано с сидениями на моем компьютере, но нужно знать, как предвидеть и исправить это, если другие собираются использовать мою программу захвата экрана!Если мой дисплей для Windows 10 установлен на 100%, я получаю немного больше, чем выбранное окно, и если я устанавливаю дисплей на 125% текста, я получаю большую часть выделенной области.Оставив размер по умолчанию у меня должно быть 555, размер 484.но я снимаю гораздо больше.

public partial class Form1 : Form
{
    //https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowrect
    [DllImport("user32.dll")]
    private static extern IntPtr GetForegroundWindow();
    [DllImport("user32.dll")]
    private static extern IntPtr GetDesktopWindow();
    [DllImport("user32.dll")]
    private static extern bool GetWindowRect(IntPtr hWnd, ref Rectangle lpRect);

    //ICON info
    //https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getcursorinfo
    [DllImport("user32.dll")]
    private static extern bool GetIconInfo(IntPtr hIcon, out ICONINFO piconinfo);
    [DllImport("user32.dll")]
    private static extern bool GetCursorInfo(out CURSORINFO pci);


    public struct POINT
    {
        public Int32 x;
        public Int32 y;
    }

    public struct ICONINFO
    {
        public bool fIcon;
        public Int32 xHotspot;
        public Int32 yHotspot;
        public IntPtr hbmMask;
        public IntPtr hbmColor;
    }

    public struct CURSORINFO
    {
        public Int32 cbSize;
        public Int32 flags;
        public IntPtr hCursor;
        public Point ptScreenPos;
    }

    GrabRegionForm grabForm;

    public void GrabRect(Rectangle rect)
    {
        int rectWidth = rect.Width - rect.Left;
        int rectHeight = rect.Height - rect.Top;
        Bitmap bm = new Bitmap(rectWidth, rectHeight);
        Graphics g = Graphics.FromImage(bm);
        g.CopyFromScreen(rect.Left, rect.Top, 0, 0, new Size(rectWidth, rectHeight));
        DrawMousePointer(g, Cursor.Position.X - rect.Left, Cursor.Position.Y - rect.Top);
        this.pb_screengrab.Image = bm;
        Clipboard.SetImage(bm);
    }
}

public partial class GrabRegionForm : Form
{
    public Rectangle formRect;
    private Form1 mainForm;
    [DllImport("user32.dll")]
    public static extern bool ReleaseCapture();
    [DllImport("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
    private void buttonOK_Click(object sender, EventArgs e)
    {
        formRect = new Rectangle(this.Left, this.Top, this.Left + this.Width, this.Top + this.Height);
        this.Hide();
        mainForm.GrabRect(formRect);
        Close();
    }
}

ScreenGrab с отображением на 100%

ScreenGrab с отображением на 125%

Область, показывающая окно захвата

Область, фактически захваченная

1 Ответ

0 голосов
/ 11 февраля 2019

Если используется более ранняя, чем 4.7, а не Windows 10, следуйте примеру Jimi и убедитесь, что вы выходите из системы и возвращаетесь в Windows.

Из Jimi https://stackoverflow.com/users/7444103/jimi Как настроить приложение для правильной работы на компьютерес высокой настройкой DPI Как настроить приложение для правильной работы на компьютере с высокой настройкой DPI (например, 150%)?

От Jimi https://stackoverflow.com/users/7444103/jimi Использование SetWindowPos снесколько мониторов Использование SetWindowPos с несколькими мониторами

Если я настрою свое приложение для Windows 10 Только сейчас это невероятно просто.Microsoft упростила изменение настроек DPI с помощью 4.7 при использовании Windows 10.

https://docs.microsoft.com/en-us/dotnet/framework/winforms/high-dpi-support-in-windows-forms

Объявите совместимость с Windows 10. Затем добавьте следующее в файл app.manifest вXML в соответствии с рекомендацией о совместимости с Windows 10.

supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"

Включение поддержки DPI для каждого монитора в файле app.config.Windows Forms представляет новый элемент для поддержки новых функций и настроек, добавленных начиная с .NET Framework 4.7.Чтобы воспользоваться новыми функциями, поддерживающими высокий DPI, добавьте в файл конфигурации приложения следующее:

Перейдите в строку XML для System.Windows.Forms.ApplicationConfigurationSection

add key="DpiAwareness" value="PerMonitorV2"
...