【问题标题】:Pressing windows msdn dialog box buttons and changing the 'Edit' in ''Save as' dialog box in Delphi按下 windows msdn 对话框按钮并在 Delphi 的“另存为”对话框中更改“编辑”
【发布时间】: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 之类的东西来做。
  • @David 问题是关于按下按钮和控制对话框,而不是下载文件。但是,为了回答你的问题,这里有 2 个链接:link,link
  • 我只是想向您指出一个可能更简单的解决方案。
  • 我猜你也意识到 CompareText(p,'File Download') 意味着该代码仅适用于英文版本的 Windows。这表明了这些方法的问题。如果您绝对必须控制另一个程序的 UI,请使用自动化界面。这就是它的用途。
  • 没什么大不了的。您向要单击的按钮发送 BM_CLICK。如果它不起作用,可能是因为对话框未激活(请参阅 BM_CLICK 文档的备注),或者可能是其他原因(如错误的句柄 f.i.)。

标签: delphi button


【解决方案1】:

免责声明:以下代码不适合以任何方式使用,如果环境不同(此处为 W7),它将无法正常工作。

无论如何,将以下内容放入您的计时器处理程序中,并尝试使用问题中的代码来锻炼差异(如果它有希望的话..):

var
  WHandle, ButtonHandle, EditHandle: HWND;
begin
  WHandle := FindWindow('#32770', 'File Download');
  if WHandle <> 0 then begin
    SetForegroundWindow(WHandle);
    ButtonHandle := GetDlgItem(WHandle, $114B);
    if ButtonHandle <> 0 then begin  // click the button
      // the dialog/button is kind of deaf.. 
      while IsWindowEnabled(WHandle) do begin
        SendMessage(ButtonHandle, BM_CLICK, 0, 0);
        Sleep(100);
      end;
      WHandle := 0;
      while WHandle = 0 do begin     // wait for the save as dialog
        WHandle := FindWindow('#32770', 'Save As');
        Sleep(100);
      end;
      while not IsWindowVisible(WHandle) do
        Sleep(100);
      // get through the edit handle
      WHandle := FindWindowEx(WHandle, 0, 'DUIViewWndClassName', nil);
      EditHandle := GetWindow(GetWindow(GetWindow(GetWindow
                    (WHandle, GW_CHILD), GW_CHILD), GW_CHILD), GW_CHILD);
      SetWindowText(EditHandle, 'test text');
    end;
  end;

【讨论】:

  • 感谢 Sertac。我用 spy++ 找到了“编辑”。在 Windows XP 中它是:EditHandle := GetWindow(GetWindow(GetWindow(GetWindow(GetWindow(GetWindow(GetWindow(GetWindow(GetWindow(GetWindow(GetWindow(WHandle,GW_CHILD),GW_HWNDNEXT),GW_HWNDNEXT),GW_HWNDNEXT),GW_HWNDNEXT),GW_HWNDNEXT)) ,GW_HWNDNEXT),GW_HWNDNEXT),GW_HWNDNEXT),GW_CHILD),GW_CHILD);
  • @james - 在 XP 中,我相信您可以使用 GetDlgItem(WHandle, edt1) (edt1=$0480)(其他人为link)进行编辑,WHandle 是保存对话框的句柄或它的直系孩子,现在不记得是哪一个了。
  • 再次感谢。我能够使用 cmb13($047c) 获得组合框,但无法让 edt1($0480) 工作。所以句柄现在是 EditHandle:=GetWindow(GetWindow(GetDlgItem(WHandle,$047c),GW_CHILD),GW_CHILD);这更清洁。再次感谢。很有趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 2019-11-24
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多