【发布时间】:2012-11-20 05:55:50
【问题描述】:
我从here 获得了以下代码并对其进行了一些更改,并且我也对原始问题进行了一些更改。
定时器间隔设置为 5000。
在以下 3 个事件发生后,“Events OnTimer”程序将开始工作。
- 1.WebBrowser1.Navigate('任何网页');
- 2.等待加载
- 3.以编程方式按下下载文件按钮
现在的问题是我找不到属于“另存为”对话框(或者是其子级)的“编辑”(类名)句柄。在下面的代码中,“编辑”的句柄为“0”,但如果我使用鼠标指针和以下代码:
HND:= WindowFromPoint(PNT);
Label1.Caption:= IntToStr(HND);
句柄给出一个结果。一旦我有了手柄,我就可以使用:
SetWindowText(EditHandle, 'test text');
更改“编辑”(类名)中的文本。
procedure TForm1.Timer1Timer(Sender: TObject);
Var
WHandle : HWND ;
ParentHandle : DWORD ;
P : Array[0..256] Of Char ;
ProcessIdActif : DWORD ;
begin
ProcessIdActif := 0 ;
GetWindowThreadProcessId (handle,@ProcessIdActif);
WHandle := FindWindow( Nil, Nil);
While (WHandle <> 0) Do
begin
P[0] := #0;
GetWindowText(WHandle, P, 255);
if P[0] <> #0 then
begin
GetWindowThreadProcessId (WHandle,@ParentHandle);
if ProcessIdActif = ParentHandle then
begin
if CompareText(p,'File Download') = 0 then
begin
ButtonHandle := FindWindowEx(WHandle, 0, 'Button', '&Save');
if (ButtonHandle > 0) then
PostMessage(ButtonHandle, BM_CLICK, 0, 0);
end
else if CompareText(p,'Save As') = 0 then
begin
EditHandle := FindWindowEx(WHandle, 0, 'Edit',NIL);
if (EditHandle > 0) then
SetWindowText(EditHandle, 'test text');
end;
end;
end;
WHandle := GetWindow(WHandle, GW_HWNDNEXT);
end;
end;
我一直在努力理解 here 的所有内容,但我错过了一些东西。
我可以通过移动鼠标并以编程方式按下鼠标来按下任何 Windows 对话框按钮,但我想弄清楚如何以更简洁的方式按下这些按钮。
【问题讨论】:
-
为什么要使用可视化组件来下载文件。用 Indy 之类的东西来做。
-
我只是想向您指出一个可能更简单的解决方案。
-
我猜你也意识到 CompareText(p,'File Download') 意味着该代码仅适用于英文版本的 Windows。这表明了这些方法的问题。如果您绝对必须控制另一个程序的 UI,请使用自动化界面。这就是它的用途。
-
没什么大不了的。您向要单击的按钮发送 BM_CLICK。如果它不起作用,可能是因为对话框未激活(请参阅 BM_CLICK 文档的备注),或者可能是其他原因(如错误的句柄 f.i.)。