Как определить, на каком мониторе запущена программа ASP.NET? - PullRequest
2 голосов
/ 18 июля 2011

Я прочитал множество других вопросов и погуглил проблему, но я могу понять, как это сделать, только если использую winforms. В настоящее время я пишу библиотеку, и одна из функций библиотеки заключается в обработке журналов. Одна из функций, которые я реализую для этого, - это автоматически сделать скриншот страницы, прежде чем записывать проблему в журнал. Проблема в том, что я не знаю, с какого монитора сделать снимок экрана, поэтому, если пользователь перемещает браузер на другой монитор, я все равно делаю снимок с основного.

public static Bitmap ScreenShot(string saveLocation, string fileName)
{
    Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
    Graphics.FromImage(bitmap).CopyFromScreen(0, 0, 0, 0, bitmap.Size);
    string savePath = Path.Combine(Path.GetDirectoryName(saveLocation), "ScreenShots");
    if (!Directory.Exists(savePath))
        Directory.CreateDirectory(savePath);
    bitmap.Save(Path.Combine(savePath, fileName), ImageFormat.Png);
    return bitmap;
}

Я пробовал Screen.FromControl(), но, поскольку это не приложение winforms, у меня нет ни одного System.Windows.Forms.Controls для его поиска.

Есть ли в ASP.NET аналог? Или что-то, что я могу явно привести к элементу управления winform?

Ответы [ 8 ]

7 голосов
/ 18 июля 2011

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

Вероятно, выглядит как для работы на вашей платформе разработки, но только потому, что ваш веб-сервер и ваш клиентский компьютер являются одинаковыми машинами.

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

4 голосов
/ 18 июля 2011

Конечно, любой код, который вы здесь запускаете, будет запущен на сервере, поэтому он не будет знать, где он отображается

Теоретически вы можете использовать JS для захвата DOM, а затем отправить его обратно в службучерез вызов Ajax - это самое близкое, что вы получите, я думаю

3 голосов
/ 18 июля 2011

Вы пытаетесь сделать снимок экрана клиента из приложения ASP.NET? Это невозможно Возможно, вам удастся зарегистрировать весь запрос, включая HTML, а затем повторно обработать его где-нибудь еще, но вы не можете иметь такого рода взаимодействие с клиентом из серверной среды приложения.

2 голосов
/ 19 июля 2011

ASP.Net WebForms не работают, как вы думаете, они работают. Краткий ответ - нет, вы не можете сделать это в ASP.Net. Нет эквивалента.

WinForms отображаются при взаимодействии с операционной системой Windows и отображаются на рабочем столе того же компьютера. Веб-формы отображаются путем генерации HTML и отправки HTML в браузер другого компьютера. Ваш код ASP.Net не работает в браузере другого компьютера. Если ваш код пытается сделать снимок экрана, то в лучшем случае вы получите дисплей сервера (или вашего компьютера).

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

Когда ASP.Net сталкивается с проблемой, он регистрирует подробности в журнале Windows на сервере, а также (с меньшей детализацией) в файлах журнала IIS. Если вы столкнулись с ошибкой, рассмотрите возможность отправки себе по электронной почте и посмотрите, что пошло не так.

2 голосов
/ 18 июля 2011

если пользователь переместит браузер на другой монитор, я все равно сделаю снимок с основного

ASP.NET работает на сервере, поэтому написание серверного кода для захвата экрана браузером не имеет смысла. Возможно, вам больше повезет, если вы сделаете скриншот с помощью клиентского кода (javascript).

В этой теме используется решение ActiveX: Сделать скриншот веб-страницы с JavaScript?

1 голос
/ 19 июля 2011

Я бы украл алгоритм, используемый в настоящее время Google +. У меня точно нет точного алгоритма или даже алгоритма, который близок к реальному, но я думаю, что это то, что он делает:

  • пользователь нажимает на кнопку 'log / report error'
  • Сервер отображает текущую страницу с использованием положения полосы прокрутки и размера окна (доступного через JS).
  • сервер рендерит div, охватывающий все окно, и помещает в него изображение. Этот div имеет самый высокий z-индекс.
  • когда пользователь нажимает на элемент div, создается новый элемент div, который позволяет пользователю «выделять» выбранные области. Затем пользователю разрешается прикрепить комментарий к этой выбранной области.

Это гений в исполнении.

0 голосов
/ 19 июля 2011

Я давно делал это для приложения отслеживания ошибок, используя элемент управления ActiveX, написанный на --gasp-- Visual Basic.Нечто подобное (кроме упомянутого крутого трюка в Google+) - ваш единственный выбор.

0 голосов
/ 18 июля 2011

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

...