Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
Delphi 12 Athens
|
AW: Modales Form finden, auf welches die Anwendung gerade wartet
12. Feb 2012, 13:12
Delphi-Quellcode:
function GetModalWindow(SomeWindow: HWnd): HWnd;
var
WindowList: TList;
hThread: DWORD;
function EnumFunc(aWnd: HWnd; List: lParam): Boolean; stdcall;
begin
if ((GetWindowLong(aWnd, GWL_EXSTYLE) and WS_EX_MDICHILD) = 0) and
IsWindowEnabled(aWnd) and IsWindowVisible(aWnd) then
TList(List).Add(Pointer(aWnd));
Result := true;
end;
begin
Result := 0;
if SomeWindow <> 0 then
begin
WindowList := TList.Create;
try
hThread := GetWindowThreadProcessID(SomeWindow);
EnumThreadWindows(hThread, @EnumFunc, lParam(WindowList));
if WindowList.Count = 1 then
Result := HWnd(WindowList[0]);
finally
WindowList.Free;
end;
end;
end;
function IsThreadTopWindow(aWnd: HWnd): Boolean;
var
NextWnd: HWnd;
aThreadID, NextThreadID: DWORD;
begin
Result := true;
if aWnd <> 0 then
begin
aThreadID := GetWindowThreadProcessID(aWnd);
NextWnd := GetWindow(aWnd, GW_HWNDPREV);
while Result and (NextWnd <> 0) do
begin
NextThreadID := GetWindowThreadProcessID(NextWnd);
if (NextThreadID = aThreadID) and IsWindowVisible(NextWnd) then
Result := false
else
NextWnd := GetWindow(NextWnd, GW_HWNDPREV);
end;
end;
end;
function BringToForeground(aWnd: HWnd): Boolean;
const
DRAWFLAGS = RDW_ERASE or RDW_INVALIDATE or RDW_UPDATENOW or RDW_ALLCHILDREN;
MOVEFLAGS = SWP_NOMOVE or SWP_NOSIZE;
SHOWMOVEFLAGS = MOVEFLAGS or SWP_SHOWWINDOW;
begin
Result := true;
if (aWnd <> 0) and IsWindowVisible(aWnd) then
begin
Result := SetWindowPos(aWnd, HWND_TOPMOST, 0, 0, 0, 0, MOVEFLAGS) and
SetWindowPos(aWnd, HWND_NOTOPMOST, 0, 0, 0, 0, MOVEFLAGS) and
SetWindowPos(aWnd, HWND_TOP, 0, 0, 0, 0, SHOWMOVEFLAGS);
if Result then
RedrawWindow(aWnd, nil, 0, DRAWFLAGS);
end;
end;
Damit klappt das (bislang) auch bei fremden Anwendungen. Für die eigene wäre so etwas denkbar (Prozedur ist Applicaton.OnIdle zugewiesen):
Delphi-Quellcode:
procedure TFrmMain.DoOnIdle(Sender: TObject; var Done: Boolean);
var
ModalWnd: HWnd;
begin
ModalWnd := GetModalWindow( Handle);
if (ModalWnd <> 0) and not IsThreadTopWindow(ModalWnd) then
BringToForeground(ModalWnd);
Done := true;
end;
Detlef "Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
|
|
Zitat
|