« MiGrep Ver1.2正式版を公開しました | トップページ | 送るメニューに「圧縮 (パスワードZIP形式)フォルダー」を追加する »

2017.07.28

Windowsでウィンドウの影表示をON/OFFする

MiCapLiteで特定のウィンドウをキャプチャする際に、WIndows7では四隅の丸く面取りされている部分にウィンドウの影とデスクトップの背景が写り込んでしまします。
で、一時的にウィンドウの影を非表示にして、そのウィンドウの裏側に無地のフォームを表示させることで、角の丸い部分の裏側もきれいにキャプチャ出来るのではと思った次第です。
ところが、Web上を検索してもプログラム上からAPI等を使ってウィンドウの影表示をON/OFFする方法が中々見つからなかったのですが、MSDNの英語版ページでやっと見つけました。
ちなみに、レジストリ「HKEY_CURRENT_USER\Control Panel\Desktop」のキー「UserPreferencesMask」の値を書き換える方法も試したのですが、該当のデータを書き換えてもその結果はWindowsにログオンし直さないと反映されないため使えませんでした。

見つけたAPIはSystemParametersInfoで、このAPIを用いるとデスクトップの影表示のON/OFFを即座に切り替えることが出来ます。MiCapLiteでは、特定のウィンドウをキャプチャする際にウィンドウの影が有効になっているかどうかを確認し、有効だった場合には一旦影を無効にしてウィンドウの裏側に背景色を表示させてキャプチャし、その後影の表示を元に戻すといった処理にしました。

普通にキャプチャ・・・四隅に影と背景が残っている
Captnormal

ウィンドウの影をOFFにして裏側を白色でカバーした場合
Captwoshadow

ウィンドウの影部分までを裏側白色でカバーしてキャプチャした場合
Captwshadow

このAPIデスクトップ環境の変更だけではなく様々な環境の設定状況の取得と変更が出来るようです。尚、日本語版のMSDNにもSystemParametersInfoの説明はありますが、uiActionに指定する機能定数が一部しか掲載されておらず、今回用いたウィンドウの影表示に関するSPI_GETDROPSHADOWとSPI_SETDROPSHADOWの情報もありませんでしたので、詳しく知りたい方は英語版のページを参照することをおすすめします。

英語ページ:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724947(v=vs.85).aspx
日本語ページ:https://msdn.microsoft.com/ja-jp/library/cc429946.aspx

尚、uiActionに指定する定数はDelphi10.1では既に定義されているようですが、もし定義されていない開発環境の場合は、英語版MSDNのページを参照して絶対値で指定しても良いかと思います。

BOOL WINAPI SystemParametersInfo(
_In_    UINT  uiAction,
In_    UINT  uiParam,
_Inout_ PVOID pvParam,
_In_    UINT  fWinIni
);
// SystemParametersInfoで取得・設定できる項目
// Accessibility parameters
// Desktop parameters
// Icon parameters
// Input parameters
// Menu parameters
// Power parameters
// Screen saver parameters
// Time-out parameters
// UI effect parameters
// Window parameters
 
// ウィンドウの影表示をON/OFFする
// Flag:  影の表示モード
//        True: 表示する, False:表示しない
procedure SetWindowShadow(Flag: Boolean);
begin
  SystemParametersInfo(SPI_SETDROPSHADOW, 0, Pointer(Flag), 0);
end;
 
// ウィンドウの影表示の状態を取得する
// Result:  影の表示モード
//        True: 表示する, False:表示しない
function GetWindowShadow: Boolean;
var
  pvParam: Boolean;
begin
  SystemParametersInfo(SPI_GETDROPSHADOW, 0, Pointer(pvParam), 0);
  Result := pvParam;
end;

|

« MiGrep Ver1.2正式版を公開しました | トップページ | 送るメニューに「圧縮 (パスワードZIP形式)フォルダー」を追加する »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/22406/65590942

この記事へのトラックバック一覧です: Windowsでウィンドウの影表示をON/OFFする:

« MiGrep Ver1.2正式版を公開しました | トップページ | 送るメニューに「圧縮 (パスワードZIP形式)フォルダー」を追加する »