WebBrowser自动填充打开文件对话框

 

在使用WebBrowser编写自动表单填写软件的时候,不知道大家是否遇到国填写文件选择表单的情况。遇到这种情况的时候,无法直接队Html元素赋值,必须模拟手工选择的办法(是否有其它解决办法,不得而知),下面我们来说一下我的解决办法,如下:

1、先说一下正常表单的填写方式,在Delphi+WebBrowser的环境下,可采用如下代码:

1
WebBrowser.OleObject.document.all.item('XXX', 0).value :=xxx;

2、针对于文件选择表单,我们可以先模拟一下点击,打开文件选择对话框:

1
WebBrowser.OleObject.document.all.item('click', 0).value;

3、然后我们采用枚举子窗体的办法,找到文件输入位置,及"确定"按钮,以模拟选择文件:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//...
function EnumProc(Hwnd: THandle; LB: LongInt): Boolean; stdcall;
//...
function EnumProc(Hwnd: THandle; LB: LongInt): Boolean; stdcall;
var CName: array[0..255] of char;
  path: string;
  i: integer;
begin
  GetClassName(Hwnd, CName, 255);
  if CName = 'Edit' then
  begin
    path := extractfilepath(Application.ExeName) + '检索\' + nameStr + '.bmp';
    for i := 1 to length(path) do
    begin
      PostMessage(Hwnd, WM_CHAR, WPAram(path[i]), 1);
    end;
    //次数模拟选择文件,就是将文件的位置填写到选择框内。
  end;
  if (TName = '打开(&O)') or (TName ='确定') then
  begin
    PostMessage(Hwnd, WM_LBUTTONDOWN, 0, 0);
    PostMessage(Hwnd, WM_LBUTTONup, 0, 0);
    //此处模拟点击
  end;
 
  Result := True;
end;
//...
Procedure FindWin();//调用
var Hwnd:THandle;
begin
 hwnd := FindWindow(nil, Title);
 //Title为文件选择窗口标题
 if Hwnd <> 0 then
 begin
   EnumChildWindows(Hwnd, @EnumProc, lp);
 end;
end;

3、需要注意事项:

上载文件表单对话框

a、选择文件对话框的窗口标题,在不同的IE内核下是不相同的,我在Win7及Xp上测试是两种分别为"选择文   件"、"选择要加载文件"。
b、在模拟填写的时候,需要注意,在提示打开文件的时候,代码的运行是暂停的,也就是说你必须在线程中进行模拟打开。

c、在文件名输入的时候,不要用SetWindowText函数,这个函数无法实现,只能采用发送WM_CHAR消息的方式,模拟字符输入。
4、最后告诫大家,如果没有特殊的加密算法,或者其它限制,尽量直接采用Http协议来提交表单,否则有一些东西太过于麻烦。

WebBrowser自动填充打开文件对话框的更多相关文章

  1. C# OpenFileDialog打开文件对话框(详解)

    一.打开文件对话框(OpenFileDialog) 1. OpenFileDialog控件的基本属性 InitialDirectory:对话框的初始目录 Filter: 获取或设置当前文件名筛选器字符 ...

  2. java中文件保存、打开文件对话框

    package com.soft.test; //AWT: FileDialog类 + FilenameFilter类 可以实现本功能 //Swing: JFileChooser类 + FileFil ...

  3. QT 打开文件对话框汇总

    Qstring fileName = QFileDialog::getOpenFileName(this, tr("open file"), " ",  tr( ...

  4. [javaSE] GUI(打开文件对话框)

    使用FileDialog可以打开文件对话框,根据模式不同,可以分为打开文件和保存文件对话框 获取FileDialog对象,new出来,参数:所属Frame对象,String的标题,FileDialog ...

  5. Qt打开文件对话框

    项目中需要打开文件对话框,就查了一下,不得不说Qt的帮助文档做的真好,非常详细.要实现这个功能有两种方式,使用QFileDialog的静态方法,实例化QFileDialog对象. 基本算是照抄帮助文档 ...

  6. win10 只要打开文件对话框就卡死解决方法

    我电脑的问题是:win10系统,只要打开 文件对话框就卡死,假死,cpu100% 一直没有解决,但是只要把缩略图关了,就ok. 但是又想要留着缩略图,还是得显示,于是乎一直在找解决办法. 此方法好像可 ...

  7. MFC程序打开文件对话框出错的问题解决

    前几天从网上下了个图像分析的mfc小程序,是VC6的 用VC6在本地编译生成都没问题.执行起来弹出一个未处理的错误,程序崩溃退出. 想起来原来遇到过打开文件对话框方面的问题,当时项目时间紧张未能深究. ...

  8. 打开文件对话框在xp和win7上的实现文件任意多选

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在xp系统上进行文件多选,实际上其文件字符串数组的缓冲区是有限,并不能支持选择任意多个文件,为此以前我还写过一篇文章: ...

  9. VS2012下自定义打开文件对话框

    VS2012下自定义打开文件对话框,MFC的CFileDialog封装了太多,太复杂,绕得头晕,自己封装一个得了 #pragma once #include <objbase.h> #in ...

随机推荐

  1. 【BZOJ】1619: [Usaco2008 Nov]Guarding the Farm 保卫牧场(dfs)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1619 首先不得不说,,题目没看懂.... 原来就是找一个下降的联通块.... 排序后dfs标记即可. ...

  2. jdbc的简单实现demo

    直接上代码吧,只是因为上篇的心血来潮.总结哈 import java.sql.Connection; import java.sql.DriverManager; import java.sql.Re ...

  3. tcp断开时分几步

    连接时是三次握手 断开时是四次握手,因为它是半关闭造成的

  4. Fragment遇到的坑

    Fragment不要通过构造传参,要么就是bundle,要么就通过activity临时存一下,不然debug编译没问题release编译不过

  5. GitHub Pages站点官方宣布开始使用HTTPS

    导读 数百万人依靠GitHub Pages,将其作为他们的网站主机,除此之外,还有数百万人每天访问这些网站.为了更好地保护到GitHub Pages站点的通讯,也为了鼓励在因特网上更广泛地采用HTTP ...

  6. 【IIS】模块 DLL C:\Windows\System32\inetsrv\authcert.dll 未能加载。返回的数据为错误信息。

    解决方案,check  IIS --Client Certificate Mapping Authentication installed?

  7. Objective-C代码学习大纲(6)

    2011-05-11 14:06 佚名 otierney 字号:T | T 本文为台湾出版的<Objective-C学习大纲>的翻译文档,系统介绍了Objective-C代码,很多名词为台 ...

  8. 技术宅之flappy bird 二逼鸟

    师雪坤和刘阳 风靡一时的虐心小游戏<Flappy Bird>,以玩法简单.难度超高著称,不过,最近这款让全世界玩家几欲怒摔手机的游戏,被两位中国技术宅设计的"玩鸟机器人" ...

  9. chrome不支持字体12px

    如果网页字体小于12px的话,人眼看着会不太舒服,所以chrome的最小字体为12px. 如果想要缩小字体,可以尝试用CSS3中的 transform: scale(相应的缩小倍数)来实现. 不过不推 ...

  10. java读代码步骤

    一.读代码的步骤 1.知道代码时用什么IDE开发的 2.将代码导入到IDE 3.连接数据库 A)连接到测试数据库 B)有sql脚本,在本地创建一个数据库,执行脚本,建立数据结构和导入数据. 4.尝试运 ...