...den Suchen-Dialog des Windows-Explorers aufrufen?

Autor: Thomas Stutz

Kategorie: System

uses
  
DDEMan;

procedure SearchInFolder(Folder: string);
begin
  with 
TDDEClientConv.Create(Self) do
  begin
    
ConnectMode        := ddeManual;
    ServiceApplication := 'Explorer.exe';
    SetLink('Folders', 'AppProperties');
    OpenLink;
    ExecuteMacro(PChar('[FindFolder(, ' + Folder + ')]'), False);
    CloseLink;
    Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  
SearchInFolder('c:\Windows');
end;

{************************************}

// Or even easier with ShellExecute:

ShellExecute(Handle, 'find', 'C:\Windows', nilnil, SW_SHOW);

{************************************}

// Suchen-Dialog ausführen und einen Suchstring übergeben:

uses
  
ShellAPI;

procedure WindowsSuchenDialog(Verzeichnis, Suchstring: string);
var
  
hOtherWin, hFocusWin: HWND;
  OtherThreadID, iTimeOut: Integer;
  aDwordVar: DWORD;
  buf: array [0..40] of Char;
  sVerz: string;
begin
  
// ShellExecute(application.handle, 'find', 'c:\', nil, nil, SW_SHOWNORMAL);
  // oder mit TDDEClientConv
  
with TDDEClientConv.Create(nildo
  begin
    
ConnectMode := ddeManual;
    ServiceApplication := 'explorer.exe';
    SetLink('Folders', 'AppProperties');
    OpenLink;
    sVerz := IncludeTrailingBackslash(Verzeichnis);
    ExecuteMacro(PChar('[FindFolder(, '+ sVerz +')]'), False);
    CloseLink;
    Free;
  end;
  iTimeOut := 0;
  repeat
    
{ Warten, bis der Such Dialog erscheint.
      Unter Win95/98/NT4 hat der Suchdilaog die Klasse #32770.
      Unter ME/2000/XP ist die Suche in den Explorer integriert,
      darum auf CabinetWClass warten}
    
Sleep(100);
    hOtherWin := GetForegroundWindow;
    buf[0] := #0;
    GetClassName(hOtherWin, buf, 60);
    inc(iTimeOut);
  until (StrComp(buf, '#32770') = 0) or (StrComp(buf, 'CabinetWClass') = 0) or (iTimeOut > 20);
  if iTimeOut > 20 then Exit;
  repeat
    
{ Wait until it is visible }
    { Warten, bis das Fenster erscheint }
    
Sleep(100);
  until IsWindowVisible(hOtherWin);

  { Handle vom Control finden, welches den Fokus besitzt }
  
OtherThreadID := GetWindowThreadProcessID(hOtherWin, @aDwordvar);
  if AttachThreadInput(GetCurrentThreadID, OtherThreadID, True) then
  begin
    
hFocusWin := GetFocus;
    if hFocusWin <> 0 then
      try
        
SendMessage(hFocusWin, WM_SETTEXT, 0, Longint(PChar(Suchstring)));
      finally
        
AttachThreadInput(GetCurrentThreadID, OtherThreadID, False);
      end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  
WindowsSuchenDialog('c:\temp','test.txt');
end;

 

printed from
www.swissdelphicenter.ch
developers knowledge base