C#编写ActiveX网页截图控件

2019-12-30 13:05:15刘景俊

故事背景:Java组的小伙伴需要一个能在IE(还是6。。。)下截图并返回给网页的功能,但是IE做起来很麻烦(可能根本做不到),于是找到我写一个ActiveX控件实现此功能,想着可能还有其他小伙伴需要这个功能,于是就PO出来,供需要的人使用,当然也可以作为学习C#编写ActiveX的一个简单入门教程(VC++效果更好)。
功能截图如下:

C#,网页截图控件,屏幕截图,ActivX控件

代码分为两个核心部分:1、C#屏幕截图;2、C#开发ActivX控件。
 1、屏幕截图,这个在网上找到了一个只需要5行代码的实现(超级精简),当然你也可以费点功夫实现自由区域截取图片,截图后保存到本地,然后使用二进制读取jpg文件,并编码为base64返回给网页       


 public string PrintScreen()
    {
      Image baseImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
      Graphics g = Graphics.FromImage(baseImage);
      g.CopyFromScreen(new Point(0, 0), new Point(0, 0), Screen.AllScreens[0].Bounds.Size);
      g.Dispose();
      baseImage.Save("D:screen.jpg", ImageFormat.Jpeg);
      Stream file = new FileStream("D:screen.jpg", FileMode.Open);
      BinaryReader bw = new BinaryReader(file);
      var buffer = new byte[file.Length];
      bw.Read(buffer, 0, buffer.Length);
      bw.Close();
      string b64 = Convert.ToBase64String(buffer);
      return b64;
    }

2、c#开发ActiveX控件,网上示例比较多
先新建一个类库,并设置项目属性,COM可见 

C#,网页截图控件,屏幕截图,ActivX控件

并为COM互注册,这样编译完了会自动注册COM控件

C#,网页截图控件,屏幕截图,ActivX控件

完成设置后,编写代码,如下: 


using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace PrintScreenLib
{
 //为了让ActiveX控件获得客户端的信任,控件类需要实现一个名为“IObjectSafety”的接口。先创建该接口(注意,不能修改该接口的GUID值)
 [ComImport, Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
 [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
 public interface IObjectSafety
 {
 [PreserveSig]
 int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);

 [PreserveSig()]
 int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);
 }
}