uses
ShellAPI,ddeman;
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;