C #: необходимо визуализировать форму / элемент управления на «воображаемом» рабочем столе - PullRequest
3 голосов
/ 02 февраля 2010

Хорошо, вот что я пытаюсь сделать. Сначала я объясню конечный результат, которого я пытаюсь достичь, если есть другие идеи, как это сделать.

Я делаю утилиту захвата экрана, которая делает снимок экрана только из одного окна ... моего окна (над которым у меня полный программный контроль). Однако это окно может быть намного больше рабочего стола компьютера, на котором будет работать утилита. В частности, высота может достигать нескольких тысяч пикселей на компьютере с разрешением 1024x768.

Итак, я пытаюсь захватить полное окно, даже если оно намного больше экрана. Это конечный результат, которого я пытаюсь достичь.

Одним из гипотетических решений этого является рендеринг формы / элемента управления для какого-либо графического или экранного объекта и создание снимка экрана с этого объекта вместо создания снимка экрана физического рабочего стола.

По сути, мне нужно рисовать элементы управления на воображаемом экране, который существует только в коде и памяти, и я даже не знаю, что искать, поэтому даже идеи о том, что поместить в Google (поисковая система ИСТИНА), были бы полезны .

Есть идеи? Заранее спасибо!

РЕДАКТИРОВАТЬ: я использую WinForms.

Ответы [ 2 ]

1 голос
/ 02 февраля 2010

Хм, это очень странно. Вы на самом деле написали эту форму еще? Класс Form чрезвычайно настаивает на том, что его размер никогда не может быть больше экрана. Я никогда не находил обходного пути для этого и никогда не видел ни одного, опубликованного на форуме, связанном с WF.

Во всяком случае, вы не можете сделать снимок экрана, потому что у вас недостаточно экрана. Единственный другой параметр - Control.DrawToBitmap ().

«Несколько тысяч пикселей» могут привести к проблемам с исключениями OutOfMemory в 32-разрядных операционных системах при попытке создания растрового изображения. Не потому, что у вас недостаточно памяти, а потому, что в адресном пространстве виртуальной памяти не осталось пустого места, которое достаточно велико для растрового изображения. Единственный хороший обходной путь для этого - 64-разрядная операционная система.

1 голос
/ 02 февраля 2010

Вы не упомянули, какую технологию использует ваше приложение C #, я предполагаю, что это либо WinForms, либо WPF.

Если ваша реализация использует WPF, вы можете просто отобразить его в DrawingImage с правильными размерами - или даже использовать возможности печати WPF, чтобы «напечатать» содержимое окна на изображении в памяти. Вот хороший пример печати в WPF , который вы можете адаптировать (если вы используете WPF).

С приложением WinForms это немного сложнее, поскольку элементы управления WinForm не всегда хорошо масштабируются при более высоких разрешениях и могут вызывать проблемы с выравниванием. Вот ссылка, которая описывает печать экрана WinForm для изображения . Он демонстрирует печать UserControl, но вы должны иметь возможность адаптировать реализацию для ваших целей.

...