ここで私はちょうどあなたのために一緒にノックしたユニットです。
このユニットを使用するには、メインフォームとOnModalBeginコールで_GrayFormsを呼び出し、次にOnModalEndメソッドで_NormalFormsメソッドを呼び出してTApplicationコンポーネントをドロップします。
これは非常に簡単な例であり、非常に簡単に複雑にすることができます。複数の呼び出しレベルのチェックなど...
システム(開いている、保存するなど)ダイアログの場合、try ... finallyブロックでダイアログのexecuteメソッドをラップして同様の反応を得ることができます。
このユニットはWin2k、WinXP、Vistaで動作し、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.
あなたはあなたの質問を明確にする必要があり、/ DIMは、他のすべてのアプリケーションウィンドウをフェードとにかくWindows上で場所がないExposéの効果(異なりますExposéの機能を持たないカーゴ・カルト・プログラミングだけに過ぎません)。 – mghie
この動作は、Windowsプラットフォーム上の他のすべてのアプリケーションの動作と矛盾します。かなり効果があるとはいえ、Windowsプラットフォームが既に存在するインターフェース混乱に貢献している可能性が高いです。 – onnodb