C#开发ActiveX网页截图控件
故事背景: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网页截图控件相关推荐
- C#开发 ActiveX 小票打印控件
背景 去年帮朋友搞一个IE打印控件,在网上找了很多都不满足,要么是不能直接打印,要么是不能指定打印机,还有的是不能自定义样式.在网上折腾了一个周,还没搞定,于是想还不如自己开发一个吧.结果从现学C#到 ...
- 构建安全的 ASP.NET 网页和控件
本页内容 本模块内容 目标 适用范围 如何使用本模块 威胁和对策 设计注意事项 输入验证 跨站点脚本 身份验证 授权 模拟 敏感数据 会话管理 参数处理 异常管理 审核和日志记录 小结 其他资源 本模 ...
- WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色
WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色 在B/S开发中,对TreeView控件要改变当前选中节点的颜色比较方便,其有相应的SelectedNodeChanged事件 ...
- ATL和ActiveX做的控件.dll和.ocx最主要的区别(摘录)
楼主是不是说用ATL做的控件和用MFC ActiveX wizard的控件有什么区别吧 依存的动态库不一样, 一个是ATL.DLL吧, 一个是MFC42.DLL. ATL开发的控件代码少,轻便,便于网 ...
- iOS开发UI篇—UIScrollView控件介绍
iOS开发UI篇-UIScrollView控件介绍 一.知识点简单介绍 1.UIScrollView控件是什么? (1)移动设备的屏幕⼤大⼩小是极其有限的,因此直接展⽰示在⽤用户眼前的内容也相当有限 ...
- 顺顺网页电子表格控件开源下载
顺顺表格控件是基于Web的类似于微软Excel的网页电子表格控件,是一款Javascript电子表格控件. 顺顺表格的源代码开放,可以用于Web报表设计器,Web电子表格编辑器,中国特色的电子表单设计 ...
- 基于WP7开发的Silverlight常用控件详解
Silverlight是一个跨浏览器.跨客户平台的技术,能够设计.开发和发布有多媒体体验与富交互(RIA,Rich Interface Application)的网络交互程序. 针对Windows P ...
- 牛牛截图控件与利洽远程控制产品升级-支持证书自动升级
今天我们来聊一聊浏览器控件的一个痛点!看看我们是如何解决他的. 背景信息 目前市面上存在多种浏览器,IE.Chrome.Firefox.Edge以及一众国产浏览器,这些浏览器中,IE支持ActiveX ...
- 牛牛截图插件java实例_[分享]牛牛截图控件最终版
实现牛牛截图控件的初衷,是想在学习的同时,实现一个具备当前主流截图功能的插件,方便集成进不同的应用系统中,节省开发时间. 一直以来,都对目前各主流即时通讯软件的截图效果比较喜欢,前段时间专门花时间进行 ...
最新文章
- dataframe sample 采样,抽样
- 一个计算机视觉博士关于会议审稿制度的吐槽
- 9.69最长公共子串
- CTFshow php特性 web149
- phpcms调用栏目描述_phpcms v9栏目列表调用每一篇文章内容方法
- 2.static关键字.rs
- Linux下搭建yum服务器
- 【C++程序员学 python】python 之奇葩地方
- 翻译 《Why Indy?》计划进度表
- KubeSphere配置集(ConfigMap)的使用
- LINUX PATH环境变量
- android 系统的切图方式_Android UI设计及切图
- linux系统中怎么安装谷歌浏览器,linux怎么安装谷歌浏览器?
- reader java_Java Reader 类
- 【Windows】六种正确清理C盘的方法,解决你的红色烦恼
- hiveserver2 HA
- 量子计算机 液体核磁共振,用液体核磁共振实现量子计算
- Android 时区中英文显示对照
- vue 解析并播放amr文件
- scanf与空白字符
热门文章
- 香槟分校计算机科学排名,伊利诺伊大学厄巴纳-香槟分校计算机科学与工程世界排名2020年最新排名第42(ARWU世界排名)...
- 全网最具深度的三次握手、四次挥手讲解,稳进大厂
- 保洁阿姨看完都会了!java面向对象编程开发证书
- python【蓝桥杯vip练习题库】ADV-306输出三个整数的最大数
- 算法提高 邮票面值设计
- 预计2021年电视出货量有所上涨,网络推广外包之下OLED大肆布局
- 浅析企业网站如何选择合适的网站空间
- 浅析企业网站软文效果是如何展现的?
- 如何查询中文期刊等级分类表_必备 | 如何查找期刊是否为核心刊物、SCI、SSCI、CSSCI、ISTP?...
- php新闻模块,新闻模块实现