OK WaitForInputIdle rufe ich jetzt nach Aufruf des fremden Programms auf. Das fremde Programm starte ich im OnCreate Ereignis meiner Anwendung.
Habe versucht mit folgender Routine von SPRINT den Focus zurückzubekommen:
Delphi-Quellcode:
procedure TForm1.ForceSetForegroundWindow(AHandle: HWND);
var
AppHWnd: HWND;
AppThreadId: DWORD;
ThisThreadId: DWORD;
TimeOut: DWORD;
begin
if GetForegroundWindow <> AHandle then
begin
BringWindowToTop(AHandle);
SetForegroundWindow(AHandle);
AppHWnd := GetForegroundWindow;
if AppHWnd <> AHandle then
begin
AppThreadId := GetWindowThreadProcessId(AppHWnd, nil);
ThisThreadId := GetCurrentThreadId;
if (AppThreadId <> 0) and (ThisThreadId <> 0) then
begin
if AttachThreadInput(ThisThreadId, AppThreadId, True) then
begin
BringWindowToTop(AHandle);
SetForegroundWindow(AHandle);
AttachThreadInput(ThisThreadId, AppThreadId, False);
end;
if GetForegroundWindow <> AHandle then
begin
SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @TimeOut, 0);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0), SPIF_SENDCHANGE);
BringWindowToTop(AHandle);
SetForegroundWindow(AHandle);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(TimeOut), SPIF_SENDCHANGE);
end;
end;
end;
end;
end;
wobei ich als
Handle "self.handle" eingebe. Das führe ich jetzt im OnActivate Ereignis meiner Anwendung aus. Funzt aber nicht und ich verstehe nicht warum.