ASP.NET/ActiveX/Silverlight Снимок экрана - PullRequest
3 голосов
/ 03 декабря 2009

Мне нужен способ захвата экрана в веб-приложении любым возможным способом. Есть ли такой способ без установки других инструментов, таких как SnagIt? Могу ли я использовать Win32 DllImports в компоненте ActiveX и сделать это таким образом?

Заранее спасибо!

Ответы [ 4 ]

2 голосов
/ 06 июля 2010

С чистым кодом Silverlight, как в браузере, так и вне браузера, невозможно сделать снимок экрана (, к счастью! * ) Это было бы огромной проблемой конфиденциальности и безопасности, если бы мошеннический веб-сайт мог захватить ваш экран и отправьте его на свой веб-сайт).

Написав плагин для браузера (например, элемент управления ActiveX, который будет работать только в IE), вы можете написать необходимый код Win32, чтобы сделать снимок экрана. Для управления изображением, загрузкой, безопасностью файлов и т. Д. Все еще потребуются некоторые тяжелые усилия. Возможно, вы сможете написать элемент управления COM в C #, но его нужно будет поместить в GAC (таким образом, подписать и т. Д.).

Существуют и другие решения, которые включают локальную собственную установку и приложение Silverlight на основе браузера, но все они требуют установки на ПК.

Я бы предложил вместо этого рассмотреть простой, не требующий установки (или один клик) EXE-файл, который можно запустить с ПК, который просто делает снимок экрана и загружает его / электронную почту / и т. Д. гораздо меньше хаков, чтобы заставить его работать.

Обратите внимание, что в Windows 7 появился новый аксессуар, называемый Snipping Tool, который может сделать снимок экрана и отправить его по электронной почте.

0 голосов
/ 01 февраля 2013

Для всех, кто столкнется с этим в будущем, есть также великолепный вариант использования фантомов (http://phantomjs.org/)!

0 голосов
/ 11 сентября 2010

Вот код, который сделает снимок экрана вашего приложения Silverlight. и тогда вы можете отправить его или что-нибудь: -)

Просто создайте проект silverlight (с обычной главной страницей и т. Д. И замените его на *. 1003 *

работает как в 3.0, так и в 4.0 (не пробовал 2.0 и ниже)

Надеюсь, я помогу С уважением Reload

.cs

с использованием системы; с помощью System.Collections.Generic; с помощью System.Linq; используя System.Net; с помощью System.Windows; с помощью System.Windows.Controls; с помощью System.Windows.Documents; с помощью System.Windows.Input; с помощью System.Windows.Media; с помощью System.Windows.Media.Animation; с помощью System.Windows.Shapes; с помощью System.Windows.Data; с помощью System.Windows.Media.Imaging;

namespace SilverlightApplication1 { открытый частичный класс MainPage: UserControl { public MainPage () { InitializeComponent (); }

    private void UIelementShoot(object sender,

RoutedEventArgs e) { theImageToSend.Source = new WriteableBitmap (elementToCapture, ноль); }

    private void ScreenShoot(object sender,

RoutedEventArgs e) { theImageToSend.Source = new WriteableBitmap (LayoutRoot, null); }

    private void Button_Click(object sender,

RoutedEventArgs e) {

    }
} }

XAML:

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:SilverlightApplication1" x:Class="SilverlightApplication1.MainPage"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot" Background="White" Width="400" Height="300" >
        <Image x:Name="theImageToSend" Margin="191,56,44,103" d:LayoutOverrides="HorizontalAlignment"/>
        <TextBox x:Name="elementToCapture" Margin="37,56,0,130" TextWrapping="Wrap" Text="TextBox" Width="124" HorizontalAlignment="Left" d:LayoutOverrides="Width"/>
        <Button Content="Make ScreenShoot" HorizontalAlignment="Right" Margin="0,0,44,26" VerticalAlignment="Bottom" Width="139" Click="ScreenShoot"/>
        <Button Content="Make TextBox Shoot" HorizontalAlignment="Left" Margin="61,0,0,26" VerticalAlignment="Bottom" Width="139" Click="UIelementShoot"/>


    </Grid>
</UserControl>
0 голосов
/ 26 мая 2010

На форумах Silverlight говорят, что это невозможно только с Silverlight из-за безопасности.

Я думаю, что это как-то возможно, потому что PrintDocument в основном делает то же самое. Смотрите ниже, где мы указываем на LayoutRoot для печати.

В ссылках с этого форума они регистрируют DLL в GAC и используют ее для создания снимка экрана. Не очень приятно; -)
http://forums.silverlight.net/forums/p/163378/367809.aspx

private void ButtonPrint_Click(object sender, System.Windows.RoutedEventArgs e)
{
    PrintDocument pd = new PrintDocument();
    pd.PrintPage += OnPrintPage;
    pd.Print("from Silverlight");
}

private void OnPrintPage(object s, PrintPageEventArgs args)
{
    args.PageVisual = LayoutRoot;
}
...