首页 > 代码库 > WebBrowser自动填充打开文件对话框

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

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

2013年06月24日 ⁄ 代码 ⁄ 共 1456字 ⁄ 字号 小 中 大 ⁄ 暂无评论 ⁄ 阅读 882 views 次

在使用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协议来提交表单,否则有一些东西太过于麻烦。