1

ここから次のコードを取得して少し変更し、元の質問も少し変更しました。

タイマー間隔は 5000 に設定されています。
次の 3 つのイベントが発生した後、'Events OnTimer' 手順が開始されます。

  • 1.WebBrowser1.Navigate('任意の Web ページ');
  • 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;

ここですべてを理解しようとしていますが、何かが欠けています。

マウスを動かしてプログラムでマウスを押すことで、ウィンドウのダイアログボタンを押すことができますが、これらのボタンをよりきれいな方法で押す方法を見つけたいと思います。

4

1 に答える 1

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;
于 2012-11-21T15:19:22.640 に答える