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. c# http请求,获取非200时的响应体

    HttpWebResponse res = null; try { res = request.GetResponse() as HttpWebResponse; } catch (WebExcept ...

  2. c#后台List转为js对象(在前台操作)

    <!-- 用html标签防止html转义 (html.raw方法转双引号中的双引号时不会转义) --><input id="json" type="hi ...

  3. Autofac IoC容器基本使用步骤【1】

    原文:http://www.bkjia.com/Asp_Netjc/888119.html  [原文中有一个地方报错,下面已修改] 一.基本步骤: 1.设计适合控制反转(IoC)的应用程序 2.给应用 ...

  4. Laravel5.1 表单验证

    当我们提交表单时 通常会对提交过来的数据进行一些验证.Laravel在Controller类中使用了一个traint:ValidatesRequest.方便我们在控制器中使用验证器. 下面我们就来看一 ...

  5. 《jquery权威指南2》学习笔记------基础函数

    Math.floor(Math.random() * 7 + 1); Math.random() 生成0和1之间的随机小数Math.random() * 7 生成0和7之间的随机小数Math.rand ...

  6. flex布局,input点击软键盘激活,底部按钮上移

    安卓手机的问题,原本表单没有超出一屏的时候,上移的现象也是存才的,只是需要滑动body才能看得到,现在,超出一屏了,现象就很明显了 body明显上移: 点击input修改价格: 软键盘出现: 先尝试了 ...

  7. webpack配置(一)

    这里再配置的时候走了些弯路,现在,把配置前的准备工作做好很重要: 首先,安装node.js,当然,npm也就有了: 其次,安装xampp,主要是为了配置Apache: 安装好后,xampp---htd ...

  8. 常用SEO优化技巧

    SEO是指搜索引擎优化 搜索引擎优化是一种利用搜索引擎的搜索规则来提高目前网站在有关搜索引擎内的自然排名的方式.SEO的目的理解是:为网站提供生态式的自我营销解决方案,让网站在行业内占据领先地位,从而 ...

  9. 160616、jQuery插件之ajaxFileUpload及jqueryeasyui学习资料分享

    第一步:先引入jQuery与ajaxFileUpload插件.注意先后顺序,ajaxFileUpload插件依赖jquery <script src="${base}/mobile/j ...

  10. 使用RMySQL连接MySQL数据库(R-3.4.3)

    1.安装DBI和RMySQL包(安装RMySQL时会依赖安装DBI) install.packages("RMySQL") 2.编写R脚本test.R # 使用RMySQL操作数据 ...