Irgendwann mal war es BringWindowToTop. Dann SetForegroundWindow. Mit der Einführung von IE4, ging es nur noch, wenn du du dich in den Thread eingehackt hast. Kann das Verhalten von den Microsoft Entwicklern irgendwie nicht nachvollziehen. Aber die werden sich bestimmt etwas dabei gedacht haben.
Delphi-Quellcode:
procedure TTaskMgrForm.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;
Hab ich jetzt so aus einem alten Projekt kopiert. Sollte aber immer noch funktionieren.