C\#ActiveX 웹 페이지 캡 처 컨트롤 작성

이야기 배경:자바 팀 의 파트너 는 IE(아니면 6...)가 필요 합 니 다.웹 페이지 에 캡 처 하고 되 돌려 주 는 기능 입 니 다.하지만 IE 는 하기 가 귀 찮 습 니 다.(전혀 할 수 없 을 수도 있 습 니 다)그래서 저 를 찾 아 ActiveX 컨트롤 을 써 서 이 기능 을 실현 하 게 되 었 습 니 다.다른 파트너 가 이 기능 을 필요 로 할 수도 있다 고 생각 하여 PO 를 나 왔 습 니 다.공급 이 필요 한 사람 이 사용 할 수 있 습 니 다.물론 C\#ActiveX 를 배 우 는 간단 한 입문 강좌(VC+효과 가 더 좋 습 니 다)로 도 사용 할 수 있 습 니 다.
기능 캡 처 는 다음 과 같 습 니 다.

코드 는 두 가지 핵심 부분 으로 나 뉜 다.1.C\#화면 캡 처;2.C\#ActivX 컨트롤 을 개발 합 니 다.
 1.화면 캡 처,이것 은 인터넷 에서 5 줄 코드 만 필요 한 실현(슈퍼 간소화)을 찾 았 습 니 다.물론 자유 구역 에서 그림 을 캡 처 하고 캡 처 한 후에 로 컬 에 저장 한 다음 에 바 이 너 리 로 jpg 파일 을 읽 고 base 64 로 인 코딩 하여 웹 페이지 로 돌아 갈 수 있 습 니 다.

 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);
 }
}
새 사용자 컨트롤 을 만 들 고 IObject Safe 인 터 페 이 스 를 파생 합 니 다.인 터 페 이 스 는 고정 내용 입 니 다. 

 [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 컨트롤
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기