Сложное увеличение размера рабочего стола Windows - PullRequest
0 голосов
/ 10 августа 2010

Я хочу увеличить размер рабочего стола (программно), эффект должен быть похож на присоединение второго монитора, на основном мониторе ничего не должно измениться после увеличения.

Такой трюк нужен, чтобы скрыть окно за экраном, а затем использовать PrintScreenполучить это изображение окна, вырезав его из целого экрана.

Ps Функция PrintWindow () здесь не поможет, я хочу захватить где-нибудь скрытое изображение предварительного просмотра веб-камеры, которое не накладывается, но все же "Activemovie Window" дает мнечёрное изображение.

Если вы мне не верите, попробуйте сделать снимок скрытого экрана предварительного просмотра Windows Messanger в меню Инструменты-> Мастер настройки звука ...

Ответы [ 2 ]

0 голосов
/ 25 января 2011

Вот код на C #, который позволил мне изменить размеры моей формы так, чтобы она была больше, чем область рабочего стола, заданная моими 3 мониторами.Я использовал DrawToBitmap после случайной установки backgroundcolor, чтобы увидеть, была ли нарисована невидимая часть окна, и это так.Вы просто делаете то же самое в C, чтобы получить тот же результат.Привязка и т.д. при необходимости.

   protected override void WndProc(ref Message m) {
        if (m.ToString().Contains("GETMINMAXINFO")) {
            //Get data
            MINMAXINFO obj = (MINMAXINFO)Marshal.PtrToStructure(m.LParam, typeof(MINMAXINFO));
            //Change
            if (obj.ptMaxSize.X > 0) {
                obj.ptMaxSize.X = 60000;
                obj.ptMaxSize.Y = 60000;
                obj.ptMaxTrackSize.X = 60000;
                obj.ptMaxTrackSize.Y = 60000;
                //Update
                Marshal.StructureToPtr(obj, m.LParam, true);
            }
        }
        if (m.ToString().Contains("WINDOWPOSCHANGING")) {
            //Get data
            WINDOWPOS obj = (WINDOWPOS)Marshal.PtrToStructure(m.LParam, typeof(WINDOWPOS));
            //Change
            if (obj.cx > 0) {
                obj.cx = 8000;
                //Update
                Marshal.StructureToPtr(obj, m.LParam, true);
            }
        }
        //Debug.WriteLine(m.ToString());
        base.WndProc(ref m);
    }

    [StructLayout(LayoutKind.Sequential)]
    internal struct MINMAXINFO {
        internal POINT ptReserverd;
        internal POINT ptMaxSize;
        internal POINT ptMaxPosition;
        internal POINT ptMinTrackSize;
        internal POINT ptMaxTrackSize;
    }
    [StructLayout(LayoutKind.Sequential)]
    internal struct POINT {
        internal int X;
        internal int Y;
    }



    [StructLayout(LayoutKind.Sequential)]
    internal struct WINDOWPOS {
        internal IntPtr hwnd;
        internal IntPtr hWndInsertAfter;
        internal int x;
        internal int y;
        internal int cx;
        internal int cy;
        internal uint flags;
    }
0 голосов
/ 10 августа 2010

Хм ... Вы могли бы написать видео драйвер, который должен сделать свое дело.(Причина, по которой простое перемещение окна за пределы экрана не работает, заключается в том, что большинство программ не перерисовывают все окно - только «поврежденную часть» - и даже в этом случае контекст устройства может не запомнить содержимое, если оно обращаетсявидеопамять).

...