Meim Sample funktioniert und der Dialog wird auch ordnungsgemäß geschlossen.
Du verwendest ja auch FindWindow. Ich kann dies aber nicht verwenden, da ich sonst für jede Windowssprache vorab herausfinden müsste, wie die lokale Bezeichnung des Fensters lautet.
Ich habe mal einen neuen Ansatz gestartet:
Delphi-Quellcode:
function EnumWindowsProc(wHandle: HWND; m: TMemo): Bool; stdcall; export;
var
Title, ClassName: array[0..255] of char;
tid, pid: DWORD;
begin
Result := True;
GetWindowText(wHandle, Title, 255);
GetClassName(wHandle, ClassName, 255);
tid := GetWindowThreadProcessId(wHandle, @pid);
if IsWindowVisible(wHandle) then
m.Lines.Add(string(Title) + ' | ' + string(ClassName) + ' | '+ IntToStr(tid)+'/'+IntToStr(pid));
end;
procedure TSystemForm.Button5Click(Sender: TObject);
var
pi: TProcessInformation;
si: TStartupInfo;
aFile : String;
begin
aFile := 'notepad.exe';
//aFile := 'C:\Windows\system32\rundll32.exe C:\Windows\system32\shell32.dll,Control_RunDLL C:\Windows\system32\desk.cpl';
FillMemory( @si, sizeof( si ), 0 );
si.cb := sizeof( si );
si.dwFlags := STARTF_USESHOWWINDOW;
si.wShowWindow := SW_SHOWNORMAL;
CreateProcess(
Nil,
PChar( aFile + '' ),
Nil, Nil, False,
NORMAL_PRIORITY_CLASS, Nil, Nil,
si, pi
);
Memo1.Lines.Add('processinfo.dwProcessId: '+IntToStr(pi.dwProcessId));
sleep(5000);
EnumWindows(@EnumWindowsProc, Integer(Memo1));
end;
Das ist schön, denn damit erhalte ich eine Test-Ausgabe wie:
processinfo.dwProcessId:
7896
Unbenannt - Editor | Notepad | 10084/
7896
Womit ich das Fenster dem aufrufenden Prozess zuordnen kann.
Das funktioniert dann zwar mit einem ausführbaren Programm wie notepad.exe, aber nicht beim Ausführen einer .cpl per rundll.32.exe.