zoukankan      html  css  js  c++  java
  • delphi 从 TWebbrowse组件中获取图片

    在 delphi 中使用 TWebbrowse 组件,虽然效率不如用(idhttp之类)模拟操作效率高。但其难度低,上手快,简单粗暴有效。

    从网上搜到的处理此问题的文章大多是 ctrl + c 复制到剪贴板的方法,但在 win7 64中,此法几乎没法使用,随时报剪贴板错误。

    本方法利用 IHTMLElementRender 接口,完美地解决了问题。同时,也可以加深对接口的进一步理解。

    delphi7源码下载

    unit Unit1;
    interface
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, OleCtrls, SHDocVw, MSHtml;
    type
      // 此定义是从 XE8 的 MSHTML 单元中抄的
      IHTMLElementRender = interface(IUnknown)
        ['{3050F669-98B5-11CF-BB82-00AA00BDCE0B}']
        function DrawToDC(hdc: hdc): HResult; stdcall;
        function SetDocumentPrinter(const bstrPrinterName: WideString; hdc: hdc): HResult; stdcall;
      end;
    
      TForm1 = class(TForm)
        WebBrowser1: TWebBrowser;
        Image1: TImage;
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        FFirstShow: Boolean;
        FCodeBmp: TBitmap;
      end;
    
    var
      Form1: TForm1;
    
    implementation
    const
      csUrl = 'https://account.guokr.com/sign_in/?';
    {$R *.dfm}
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      FFirstShow := true;
      FCodeBmp := TBitmap.Create;
      FCodeBmp.Height := 40;
      FCodeBmp.Width := 100;
      FCodeBmp.PixelFormat := pf24bit;
    end;
    
    procedure TForm1.FormShow(Sender: TObject);
    begin
     // 做一个 FirstOnShow 功能。
     // OnCreate 事件中使用 WebBrowser1.Navigate 的话,会出错的。
      if FFirstShow then
      begin
        WebBrowser1.Navigate(csUrl);
        FFirstShow := false;
      end;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Doc: IHTMLDocument2;
      Render: IHTMLElementRender;
    begin
      Doc := WebBrowser1.Document as IHTMLDocument2;
      Render := Doc.All.Item('captchaImage', EmptyParam) as IHTMLElementRender;
      Render.DrawToDC(Self.Canvas.Handle);
      Render.DrawToDC(FCodeBmp.Canvas.Handle);
      Image1.Picture.Assign(FCodeBmp);
    end;
    
    end.
  • 相关阅读:
    ajax实现异步请求的过程
    GET和POST的区别,何时使用POST?
    函数有几种调用方式?
    substring、slice、substr的区别
    Spring 调用 Stored Procedure 并获取返回值
    Oracle 中, 使用 Instr 函数 替换 OR
    Oracle Materialized View refresh
    Oracle中Union 和 Union All
    toString() 和 强制类型转换 (String)
    2013年这一年
  • 原文地址:https://www.cnblogs.com/lackey/p/9053967.html
Copyright © 2011-2022 走看看