ASP.NET/ActiveX/Silverlight屏幕捕获

时间:2009-12-02 21:25:19

标签: asp.net silverlight activex screenshot

我需要一种以任何可能的方式捕获Web应用程序中的屏幕的方法。有没有安装SnagIt等其他工具的方式?我可以在ActiveX组件中使用Win32 DllImports并以这种方式执行吗?

提前致谢!

4 个答案:

答案 0 :(得分:2)

使用纯粹的Silverlight代码,无论是在浏览器中还是在浏览器外,都无法捕获屏幕图像(谢天谢地!如果流氓网站可以,这将是一个巨大的隐私和安全问题捕获您的屏幕并将其发送到他们的网站)。

通过编写浏览器插件(例如ActiveX控件,只能在IE中工作),您可以编写必要的Win32代码来拍摄屏幕截图。它仍然需要一些繁重的工作来管理图像,上传,文件安全等。您可能能够在C#中编写COM控件,但它需要放在GAC中(因此签名等)。

还有其他涉及本地本机安装和基于浏览器的Silverlight应用程序的解决方案,但都需要在PC上安装。

我建议考虑一个简单的,零安装(或点击一次)的EXE,它可以从只需要屏幕截图并上传它/电子邮件等的PC上运行。这将涉及到使它工作的黑客少得多。

请注意,Windows 7有一个新配件,称为截图工具,可以拍摄屏幕图像并通过电子邮件发送。

答案 1 :(得分:0)

在Silverlight论坛上,由于安全性,他们说只有Silverlight不可能。

我认为应该可能以某种方式,因为PrintDocument基本上是这样做的.... 请参阅下面我们指向要打印的LayoutRoot的位置。

在该论坛的链接中,他们正在GAC中注册DLL并使用该DLL创建屏幕截图。不太好;-)
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;
}

答案 2 :(得分:0)

以下是一些代码,可以拍摄Silverlight应用的屏幕截图。然后你可以发送它或者什么: - )

只需创建一个silverlight项目(使用普通主页等,并替换为此。

适用于3.0和4.0(未尝试过2.0及更低版本)

希望我有所帮助 问候 的重新装载

.CS

  

使用System;运用   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;

     

命名空间SilverlightApplication1 {       public partial class MainPage:UserControl       {           公共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>

答案 3 :(得分:0)

对于将来偶然发现这一点的其他人,还有使用phantomjs(http://phantomjs.org/)的大选择!