delphi 从 TWebbrowse组件中获取图片
在 delphi 中使用 TWebbrowse 组件,虽然效率不如用(idhttp之类)模拟操作效率高。但其难度低,上手快,简单粗暴有效。
从网上搜到的处理此问题的文章大多是 ctrl + c 复制到剪贴板的方法,但在 win7 64中,此法几乎没法使用,随时报剪贴板错误。
本方法利用 IHTMLElementRender 接口,完美地解决了问题。同时,也可以加深对接口的进一步理解。
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 := ;
FCodeBmp.Width := ;
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.
delphi 从 TWebbrowse组件中获取图片的更多相关文章
- 用Delphi从内存流中判断图片格式[转]
http://blog.163.com/tfn2008%40yeah/blog/static/110321319201222243214337/ 用Delphi从内存流中判断图片格式[转] 2012- ...
- angular2的ElementRef在组件中获取不到
angular2的ElementRef在组件中获取不到 angular2不推荐操作dom,但是实际应用中不可避免的需要使用到dom操作,怎么操作,官方文档提供了一系列api(ElementRef,Vi ...
- java如何从一段html代码中获取图片的src路径
java如何从一段html代码中获取图片的src路径 package com.cellstrain.icell.Test; import java.util.ArrayList;import java ...
- 微信小程序在组件中获取界面上的节点信息wx.createSelectorQuery
节点信息查询 API 可以用于获取节点属性.样式.在界面上的位置等信息. 最常见的用法是使用这个接口来查询某个节点的当前位置,以及界面的滚动位置. 示例代码: const query = wx.cre ...
- 在自定义组件中获取spring底层组件
要想在自定义组件中获取spring底层的各种组件,只需让自定义组件实现一系列接口即可,这些接口都是Aware的子接口.常见的有: 1. ApplicationContextAware——用于获取IOC ...
- vue父组件中获取子组件中的数据
<FormItem label="上传头像" prop="image"> <uploadImg :width="150" ...
- 从网络中获取图片显示到Image控件并保存到磁盘
一.从网络中获取图片信息: /// <summary> /// 获取图片 /// </summary> /// <param name="url"&g ...
- Android中获取图片的宽和高
在Android中,我们想获取图片的宽和高应该怎么办?一.正常加载图片的方法下获取宽和高 举一个简单的例子:创建一个图片的副本 //加载原图 Bitmap bmSrc = BitmapFactory. ...
- Java乔晓松-android中获取图片的缩略图(解决OutOfMemoryError)内存溢出的Bug
由于android获取图片过大是会出现内存溢出的Bug 07-02 05:10:13.792: E/AndroidRuntime(6016): java.lang.OutOfMemoryError 解 ...
随机推荐
- Kafka+SparkStreaming+Zookeeper(ZK存储Offset,解决checkpoint问题)
创建一个topic ./kafka-topics.sh --create --zookeeper 192.168.1.244:2181,192.168.1.245:2181,192.168.1.246 ...
- Codeforces Round #367 (Div. 2) A , B , C
A. Beru-taxi time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- matlab *与.*的区别
语言用来用去老是容易忘... 还是记下来比较好点.... (1) " * " 即矩阵乘法,两个矩阵必须满足左边矩阵的列数等于右边矩阵的行数,如: A(m,k) * B(k, ...
- scheduler configuration options
Table 4.53. Description of scheduler configuration options Configuration option = Default value Desc ...
- HTTP通道
通过httptunnel技术进行入侵示例 httptunnel是通过HTTP通道来传输其他协议数据的工具软件,下载地址为:www.http-tunnel. com,目前最新版本3.0.5 工具/原料 ...
- Django 基础 路由系统
Django框架简介 MVC框架和MTV框架(了解即可) MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图 ...
- LeetCode OJ:Binary Tree Level Order Traversal II(二叉树的层序遍历)
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...
- 《ASP.NET夜话》 - 书摘精要
(P14) 如果客户端启用了Cookie,那么客户端与服务器之间通过Cookie来传递SessionID的值:如果客户端没有启用Cookie,就会通过URL来传递SessionID的值: (P15) ...
- php mysql 查询
抓取结果集对象中数据并且转换数组 $row = mysqli_fetch_assoc(结果集对象); 从结果集对象中抓取一行记录->转换关联数组 $row = mysqli_fetch_row( ...
- c语言%.*s是什么
int i; ;i<;i++) printf("%.*s%s\n", i, " ", "########"); ; *用来指定宽度,对 ...