суббота, 27 апреля 2013 г.

Ещё правки VCL (17)


unction GetTopMostWindows(Handle: HWND; Info: Pointer): BOOL; stdcall;

 {V}
 // Винда в некоторых случаях (замечено на переключении приложений Alt+Esc)
 // самостоятельно сносит WS_EX_TOPMOST еще ДО вызова этого метода
 // поэтому дополнительно проверяем TCustomForm.FormStyle
 function lIsTopMostWindow(Handle: HWND) : boolean;
 var
  lControl : TWinControl;
 begin
  Result := (GetWindowLong(Handle, GWL_EXSTYLE) and WS_EX_TOPMOST <> 0);
  if not Result then
  begin
   lControl := FindControl(Handle);
   Result := (lControl is TCustomForm) and
             (TCustomForm(lControl).FormStyle = fsStayOnTop);
  end;
 end;

begin
  Result := True;
  if GetWindow(Handle, GW_OWNER) = Application.Handle then
    if lIsTopMostWindow(Handle) and
      ((Application.MainForm = nil) or PTopMostEnumInfo(Info)^.IncludeMain or
      (Handle <> Application.MainForm.Handle)) then
      Application.FTopMostList.Add(Pointer(Handle))
    else
    begin
      PTopMostEnumInfo(Info)^.TopWindow := Handle;
      Result := False;
    end;
end;

Комментариев нет:

Отправить комментарий