2012-11-20 58 views
1

我從here得到了下面的代碼,並對其進行了一些修改,我也改變了原來的一些問題。按下windows msdn對話框中的按鈕,並在Delphi中的'另存爲'對話框中更改'編輯'

定時器間隔設置爲5000.
發生以下3個事件後,「事件OnTimer」過程將開始工作。

  • 1.WebBrowser1.Navigate('Any page');
  • 2.wait它加載
  • 3.programmatically按下載文件按鈕

現在的問題是我無法找到「編輯」(類名)處理屬於(或是'另存爲'對話框的孩子。在「編輯」手柄來「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但我失去了一些東西。

我可以通過移動鼠標並以編程方式按下鼠標按下任何窗口對話框按鈕,但我想弄清楚如何以更清潔的方式按下這些按鈕。

+0

爲什麼要使用一個可視組件下載文件。像Indy一樣做。 –

+0

@David問題是關於按下按鈕和控制對話框,而不是下載加載文件。但是,要回答你的問題,這裏有2個鏈接:[link](http://stackoverflow.com/questions/13377779/how-do-i-keep-an-embedded-browser-from-prompting-where-to-保存下載的文件),[鏈接](http://stackoverflow.com/questions/13306237/downloading-csv-files-in-delphi/13312489#13312489) –

+0

我只是想指出你可能是什麼已經是一個更簡單的解決方案。 –

回答

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; 
+0

謝謝Sertac。我用spy ++找到了'Edit'。在Windows XP中,它是:EditWindow 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); –

+0

@james - 那看起來真好:)不客氣! –

+0

@詹姆斯 - 在XP中,我相信你大概可以得到函數GetDlgItem(例WHandle,edt1)編輯(edt1 = $ 0480)([鏈接](http://msdn.microsoft.com/en-us/library/windows/ desktop/ms646960(v = vs.85).aspx)),WHandle是保存對話框的句柄或其直接子,現在不記得哪一個。 –

相關問題