How can activate a glass effect (windows Vista/7) in a console application using Delphi - Stack Overflow
というアーティクルがありました。RRUZ(Rodrigo Ruz)さんによる回答はGetConsoleWindowで取得したコンソールウィンドウにDWMのDwmEnableBlurBehindWindowでblur(グラスエフェクト)をかける、というものです。しかしこのコンソールアプリケーションはそのままではWindows 2000/XPで動作しません。そこでDwmEnableBlurBehindWindowを動的にリンクするように手を加えてみました。DWM_BLURBEHIND構造体および定数DWM_BB_...の定義はDelphi 2007のDwmAPI.pasから借りてきました。
program Project1;
{$APPTYPE CONSOLE}
uses
Windows,
SysUtils;
type
{$EXTERNALSYM PDWM_BLURBEHIND}
PDWM_BLURBEHIND = ^DWM_BLURBEHIND;
{$EXTERNALSYM DWM_BLURBEHIND}
DWM_BLURBEHIND = record
dwFlags: DWORD;
fEnable: BOOL;
hRgnBlur: HRGN;
fTransitionOnMaximized: BOOL;
end;
TDwmEnableBlurBehindWindow = function (hWnd: HWND;
pBlurBehind: PDWM_BLURBEHIND): HResult; stdcall;
const
DWMAPI = 'DWMAPI.DLL';
{$EXTERNALSYM DWM_BB_ENABLE}
DWM_BB_ENABLE = $00000001; // fEnable has been specified
{$EXTERNALSYM DWM_BB_BLURREGION}
DWM_BB_BLURREGION = $00000002; // hRgnBlur has been specified
{$EXTERNALSYM DWM_BB_TRANSITIONONMAXIMIZED}
DWM_BB_TRANSITIONONMAXIMIZED = $00000004; // fTransitionOnMaximized has been specified
function GetConsoleWindow: HWND; stdcall; external kernel32 name 'GetConsoleWindow';
var
hDWMAPI: HMODULE;
BB: DWM_BLURBEHIND;
DwmEnableBlurBehindWindow: TDwmEnableBlurBehindWindow;
begin
try
hDWMAPI := 0;
try
if Win32MajorVersion >= 6 then
begin
hDWMAPI := LoadLibrary(DWMAPI);
if hDWMAPI > 0 then
begin
@DwmEnableBlurBehindWindow := GetProcAddress(hDWMAPI,
'DwmEnableBlurBehindWindow');
if Assigned(DwmEnableBlurBehindWindow) then
begin
BB.dwFlags := DWM_BB_ENABLE;
BB.fEnable := True;
BB.hRgnBlur := 0;
BB.fTransitionOnMaximized := False;
DwmEnableBlurBehindWindow(GetConsoleWindow,@BB);
end;
end;
end;
Writeln('Hit enter key');
Readln;
finally
if hDWMAPI > 0 then
begin
FreeLibrary(hDWMAPI);
end;
end;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.
2010/11/04追記: DWMAPI.DLLがKnownDLLsではない環境(Windows 2000/XP)でバイナリ(DLL)プランティングの影響を受ける可能性があったので、LoadLibrary(PChar('DWMAPI.DLL'))を行う条件としてWin32MajorVersionが6以上(Windows Vista以降)という条件を追加しました。なおDelphi(2007以降)はDWMAPI.DLLを動的にLoadLibraryする条件としてWin32MajorVersionが6以上という検査を行うようになっており、通常の使用ではDWMAPI.DLL(の不存在)を利用したバイナリプランティングは成立しません。
0 件のコメント:
コメントを投稿