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