execute the Explorers find file dialog box?

Author: Thomas Stutz 

 

 

 

 

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', nil, nil, 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(nil) do

  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;