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

  功能截图如下:

代码分为两个核心部分: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可见

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

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

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);}
}

新建用户控件,并派生IObjectSafe接口,接口实现是固定内容

    [Guid("61D7F413-A1B2-48A9-B851-5BFBCF50280C")] //使用VS工具里的GUID生成器生成唯一码public partial class PSLib : UserControl, IObjectSafety{#region IObjectSafety 成员private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}";private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";private const string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}";private const string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}";private const string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB851}";private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;private const int S_OK = 0;private const int E_FAIL = unchecked((int)0x80004005);private const int E_NOINTERFACE = unchecked((int)0x80004002);private bool _fSafeForScripting = true;private bool _fSafeForInitializing = true;public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions){int Rslt = E_FAIL;string strGUID = riid.ToString("B");pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;switch (strGUID){case _IID_IDispatch:case _IID_IDispatchEx:Rslt = S_OK;pdwEnabledOptions = 0;if (_fSafeForScripting == true)pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;break;case _IID_IPersistStorage:case _IID_IPersistStream:case _IID_IPersistPropertyBag:Rslt = S_OK;pdwEnabledOptions = 0;if (_fSafeForInitializing == true)pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;break;default:Rslt = E_NOINTERFACE;break;}return Rslt;}public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions){int Rslt = E_FAIL;string strGUID = riid.ToString("B");switch (strGUID){case _IID_IDispatch:case _IID_IDispatchEx:if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) &&(_fSafeForScripting == true))Rslt = S_OK;break;case _IID_IPersistStorage:case _IID_IPersistStream:case _IID_IPersistPropertyBag:if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) &&(_fSafeForInitializing == true))Rslt = S_OK;break;default:Rslt = E_NOINTERFACE;break;}return Rslt;}#endregion

IE调用ActiveX控件:

<!DOCTYPE html>
<html><head><title>测试</title><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="this is my page"><meta http-equiv="content-type" content="text/html; charset=UTF-8"><script>function jt(){var str="";try{var obj = document.getElementById("MyActiveX");    str=obj.PrintScreen();}catch(e){alert(e);return;}var img=document.getElementById("img");img.src="data:image/jpeg;base64,"+str;//接受base64编码后的图片
        }</script></head><body><OBJECT ID="MyActiveX" WIDTH="120" HEIGHT=20" CLASSID="CLSID:61D7F413-A1B2-48A9-B851-5BFBCF50280C"></OBJECT><input type="button" value="截图" onclick="jt();"><Image id ="img" /></body>
</html>

一个完整的ActvieX控件就完成了,这里没有使用到事件,如果使用事件的话会更加麻烦一点,这里就不啰嗦了

下载地址:屏幕截图ActivX控件

转载于:https://www.cnblogs.com/HelliX/p/5577209.html

C#开发ActiveX网页截图控件相关推荐

  1. C#开发 ActiveX 小票打印控件

    背景 去年帮朋友搞一个IE打印控件,在网上找了很多都不满足,要么是不能直接打印,要么是不能指定打印机,还有的是不能自定义样式.在网上折腾了一个周,还没搞定,于是想还不如自己开发一个吧.结果从现学C#到 ...

  2. 构建安全的 ASP.NET 网页和控件

    本页内容 本模块内容 目标 适用范围 如何使用本模块 威胁和对策 设计注意事项 输入验证 跨站点脚本 身份验证 授权 模拟 敏感数据 会话管理 参数处理 异常管理 审核和日志记录 小结 其他资源 本模 ...

  3. WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色

    WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色  在B/S开发中,对TreeView控件要改变当前选中节点的颜色比较方便,其有相应的SelectedNodeChanged事件 ...

  4. ATL和ActiveX做的控件.dll和.ocx最主要的区别(摘录)

    楼主是不是说用ATL做的控件和用MFC ActiveX wizard的控件有什么区别吧 依存的动态库不一样, 一个是ATL.DLL吧, 一个是MFC42.DLL. ATL开发的控件代码少,轻便,便于网 ...

  5. iOS开发UI篇—UIScrollView控件介绍

    iOS开发UI篇-UIScrollView控件介绍 一.知识点简单介绍 1.UIScrollView控件是什么? (1)移动设备的屏幕⼤大⼩小是极其有限的,因此直接展⽰示在⽤用户眼前的内容也相当有限 ...

  6. 顺顺网页电子表格控件开源下载

    顺顺表格控件是基于Web的类似于微软Excel的网页电子表格控件,是一款Javascript电子表格控件. 顺顺表格的源代码开放,可以用于Web报表设计器,Web电子表格编辑器,中国特色的电子表单设计 ...

  7. 基于WP7开发的Silverlight常用控件详解

    Silverlight是一个跨浏览器.跨客户平台的技术,能够设计.开发和发布有多媒体体验与富交互(RIA,Rich Interface Application)的网络交互程序. 针对Windows P ...

  8. 牛牛截图控件与利洽远程控制产品升级-支持证书自动升级

    今天我们来聊一聊浏览器控件的一个痛点!看看我们是如何解决他的. 背景信息 目前市面上存在多种浏览器,IE.Chrome.Firefox.Edge以及一众国产浏览器,这些浏览器中,IE支持ActiveX ...

  9. 牛牛截图插件java实例_[分享]牛牛截图控件最终版

    实现牛牛截图控件的初衷,是想在学习的同时,实现一个具备当前主流截图功能的插件,方便集成进不同的应用系统中,节省开发时间. 一直以来,都对目前各主流即时通讯软件的截图效果比较喜欢,前段时间专门花时间进行 ...

最新文章

  1. dataframe sample 采样,抽样
  2. 一个计算机视觉博士关于会议审稿制度的吐槽
  3. 9.69最长公共子串
  4. CTFshow php特性 web149
  5. phpcms调用栏目描述_phpcms v9栏目列表调用每一篇文章内容方法
  6. 2.static关键字.rs
  7. Linux下搭建yum服务器
  8. 【C++程序员学 python】python 之奇葩地方
  9. 翻译 《Why Indy?》计划进度表
  10. KubeSphere配置集(ConfigMap)的使用
  11. LINUX PATH环境变量
  12. android 系统的切图方式_Android UI设计及切图
  13. linux系统中怎么安装谷歌浏览器,linux怎么安装谷歌浏览器?
  14. reader java_Java Reader 类
  15. 【Windows】六种正确清理C盘的方法,解决你的红色烦恼
  16. hiveserver2 HA
  17. 量子计算机 液体核磁共振,用液体核磁共振实现量子计算
  18. Android 时区中英文显示对照
  19. vue 解析并播放amr文件
  20. scanf与空白字符

热门文章

  1. 香槟分校计算机科学排名,伊利诺伊大学厄巴纳-香槟分校计算机科学与工程世界排名2020年最新排名第42(ARWU世界排名)...
  2. 全网最具深度的三次握手、四次挥手讲解,稳进大厂
  3. 保洁阿姨看完都会了!java面向对象编程开发证书
  4. python【蓝桥杯vip练习题库】ADV-306输出三个整数的最大数
  5. 算法提高 邮票面值设计
  6. 预计2021年电视出货量有所上涨,网络推广外包之下OLED大肆布局
  7. 浅析企业网站如何选择合适的网站空间
  8. 浅析企业网站软文效果是如何展现的?
  9. 如何查询中文期刊等级分类表_必备 | 如何查找期刊是否为核心刊物、SCI、SSCI、CSSCI、ISTP?...
  10. php新闻模块,新闻模块实现