Aquí hay una unidad que acabo de unir para usted.
Para usar esta unidad, suelte un componente de TApplication en su formulario principal y en la llamada OnModalBegin _GrayForms y luego en OnModalEnd llame al método _NormalForms.
Este es un ejemplo muy simple y podría hacerse más complejo muy fácilmente. Comprobación de niveles de llamadas múltiples, etc.
Para cosas como los diálogos de sistema (abrir, guardar, etc.) puede ajustar el método de ejecución de diálogo en un intento ... finalmente bloquear llamando a las funciones apropiadas para obtener una reacción similar .
Esta unidad debería funcionar en Win2k, WinXP, Vista e incluso debería funcionar en Win7.
Ryan.
unit GrayOut;
interface
procedure _GrayForms;
procedure _GrayDesktop;
procedure _NormalForms;
implementation
uses windows, classes, forms, Contnrs, Types, Graphics, sysutils;
var
gGrayForms : TComponentList;
procedure _GrayDesktop;
var
loop : integer;
wScrnFrm : TForm;
wForm : TForm;
wPoint : TPoint;
begin
if not assigned(gGrayForms) then
begin
gGrayForms := TComponentList.Create;
gGrayForms.OwnsObjects := true;
for loop := 0 to Screen.MonitorCount - 1 do
begin
wForm := TForm.Create(nil);
gGrayForms.Add(wForm);
wForm.Position := poDesigned;
wForm.AlphaBlend := true;
wForm.AlphaBlendValue := 64;
wForm.Color := clBlack;
wForm.BorderStyle := bsNone;
wForm.Enabled := false;
wForm.BoundsRect := Screen.Monitors[loop].BoundsRect;
SetWindowPos(wForm.handle, HWND_TOP, 0,0,0,0, SWP_NOSIZE or SWP_NOMOVE);
wForm.Visible := true;
end;
end;
end;
procedure _GrayForms;
var
loop : integer;
wScrnFrm : TForm;
wForm : TForm;
wPoint : TPoint;
wScreens : TList;
begin
if not assigned(gGrayForms) then
begin
gGrayForms := TComponentList.Create;
gGrayForms.OwnsObjects := true;
wScreens := TList.create;
try
for loop := 0 to Screen.FormCount - 1 do
wScreens.Add(Screen.Forms[loop]);
for loop := 0 to wScreens.Count - 1 do
begin
wScrnFrm := wScreens[loop];
if wScrnFrm.Visible then
begin
wForm := TForm.Create(wScrnFrm);
gGrayForms.Add(wForm);
wForm.Position := poOwnerFormCenter;
wForm.AlphaBlend := true;
wForm.AlphaBlendValue := 64;
wForm.Color := clBlack;
wForm.BorderStyle := bsNone;
wForm.Enabled := false;
wForm.BoundsRect := wScrnFrm.BoundsRect;
SetWindowLong(wForm.Handle, GWL_HWNDPARENT, wScrnFrm.Handle);
SetWindowPos(wForm.handle, wScrnFrm.handle, 0,0,0,0, SWP_NOSIZE or SWP_NOMOVE);
wForm.Visible := true;
end;
end;
finally
wScreens.free;
end;
end;
end;
procedure _NormalForms;
begin
FreeAndNil(gGrayForms);
end;
initialization
gGrayForms := nil;
end.
Debe aclarar su pregunta, dim/desaparecer todas las demás ventanas de la aplicación es diferente del efecto de ficha (que no tiene lugar en Windows de todos modos , eso no es más que programación de culto a la carga sin la funcionalidad Exposé) en el enlace. – mghie
Tenga en cuenta que este comportamiento no es coherente con la forma en que se comportan todas las demás aplicaciones en la plataforma de Windows. Aunque es un efecto bonito, es probable que contribuya al caos de la interfaz que ya tiene la plataforma Windows. – onnodb