←HSPハック トップへ

ライブプレビューのカスタマイズ

タスクバーのサムネイルにマウスカーソルを乗せると表示されるライブプレビューをカスタマイズします。

最終更新:2017/11/18

初版:2017/11/18




はじめに


前々回に続き、Windows 7にはタスクバーのサムネイルにマウスカーソルを乗せると表示されるライブプレビューをカスタマイズしようと思います。


カスタマイズまでの流れ


  1. DwmSetWindowAttribute 関数でウィンドウ属性を変更
  2. WM_DWMSENDICONICLIVEPREVIEWBITMAP メッセージが送られてきたときに、32bitビットマップを作成し、DwmSetIconicLivePreviewBitmap 関数でビットマップを設定
タスクバーのサムネイル置き換えと同様、簡単に実装できます。
ウィンドウ属性を変更する方法は前々回を参照してください。

ライブプレビューのカスタマイズ


WM_DWMSENDICONICLIVEPREVIEWBITMAP メッセージが送られてきたタイミングでDwmSetIconicLivePreviewBitmapを使ってサムネイルを置き換えます。
HRESULT WINAPI DwmSetIconicLivePreviewBitmap(
           HWND    hwnd,
           HBITMAP hbmp,
  _In_opt_ POINT   *pptClient,
           DWORD   dwSITFlags
);
hwnd に変更するウィンドウハンドルを指定します。
hbmp にライブプレビューとして使われる32bitのビットマップハンドルを指定します。
DWMは指定したビットマップをコピーして使用ますので、関数の呼び出しが終わったらDeleteObjectしてもかまいません。

pptClient にホストウィンドウのフレームからのタブウィンドウのクライアント領域(クライアントウィンドウフレーム内のコンテンツ領域)のオフセットを指定します。
dwSITFlags にライブプレビューの表示オプションを指定します。
意味
0(0x00000000)ライブプレビューの周りにフレームを表示しない
DWM_SIT_DISPLAYFRAME(0x00000001)ライブプレビューの周りにフレームを表示する


指定するビットマップは32bitの色深度が必要です。

スクリプト


表示されたHSPウィンドウとは違うライブプレビューを表示させるサンプルです。 buffer 1をライブプレビュー用画像として使います。
Before
Screenshot
After
Screenshot

//HSP3.5から対応
//(c) inonote 2017
#packopt name "ライブプレビュー置き換え"

#include "gdi32.as"
#include "user32.as"
#uselib "dwmapi.dll"
#func DwmSetIconicLivePreviewBitmap "DwmSetIconicLivePreviewBitmap" int, int, int, int
#func DwmSetWindowAttribute "DwmSetWindowAttribute" int, int, int, int

#define BI_RGB 0
#define SRCCOPY 0x00CC0020

#define DWM_SIT_DISPLAYFRAME 0x00000001
#define WM_DWMSENDICONICLIVEPREVIEWBITMAP 0x0326
#enum DWMWA_NCRENDERING_ENABLED = 1
#enum DWMWA_NCRENDERING_POLICY
#enum DWMWA_TRANSITIONS_FORCEDISABLED
#enum DWMWA_ALLOW_NCPAINT
#enum DWMWA_CAPTION_BUTTON_BOUNDS
#enum DWMWA_NONCLIENT_RTL_LAYOUT
#enum DWMWA_FORCE_ICONIC_REPRESENTATION
#enum DWMWA_FLIP3D_POLICY
#enum DWMWA_EXTENDED_FRAME_BOUNDS
#enum DWMWA_HAS_ICONIC_BITMAP
#enum DWMWA_DISALLOW_PEEK
#enum DWMWA_EXCLUDED_FROM_PEEK
#enum DWMWA_CLOAK
#enum DWMWA_CLOAKED
#enum DWMWA_FREEZE_REPRESENTATION
#enum DWMWA_LAST

buffer 1 //ライブプレビュー用画像バッファ
color 122, 0, 122:boxf
color 0, 0, 0:font "MS 明朝", 128
mes "ライブ\nプレビュー\n置き換え済"

screen 0
color 122, 255, 122:boxf
color 0, 0, 0:font "MS ゴシック", 128
mes "あいうえお"

oncmd gosub *OnSendIconicLivePreviewBitmap, WM_DWMSENDICONICLIVEPREVIEWBITMAP

// ウィンドウの属性を変更してライブプレビューを変更できるようにする
trueValue=1
DwmSetWindowAttribute hwnd, DWMWA_FORCE_ICONIC_REPRESENTATION, varptr(trueValue), 4
DwmSetWindowAttribute hwnd, DWMWA_HAS_ICONIC_BITMAP, varptr(trueValue), 4

stop
*OnSendIconicLivePreviewBitmap //Aeroプレビュービットマップを求めた
	SetIconicLivePreviewBitmapFromBuffer hwnd, 1
return 0

//SetIconicLivePreviewBitmapFromBuffer ウィンドウハンドル, バッファID
#deffunc SetIconicLivePreviewBitmapFromBuffer int hnd, int bufferid
	dim Rect, 4
	oldbufferid = ginfo_sel
	gsel bufferid
	Rect = 0, 0, ginfo_sx, ginfo_sy
	
	//ライブプレビュー用 32bit ビットマップ作成
	imagesize = Rect(2)*Rect(3)*4
	bmi = 40, Rect(2), Rect(3), 1|(32<<16),BI_RGB, imagesize
	
	hdc_livepre = CreateCompatibleDC(0) //デバイスコンテキスト作成
	hbmp_livepre = CreateDIBSection(0, varptr(bmi), 0, varptr(lpBits), 0, 0) //ビットマップ作成
	if (hbmp_livepre){
		hOldBmp1 = SelectObject(hdc_livepre, hbmp_livepre)
		BitBlt hdc_livepre, 0, 0, Rect(2), Rect(3), hdc, 0, 0, SRCCOPY //HSPの仮想スクリーンからコピー
		
		//後片付け
		SelectObject hdc_livepre, hOldBmp1
	}
	DeleteDC hdc_livepre
	DwmSetIconicLivePreviewBitmap hnd, hbmp_livepre, varptr(Rect), DWM_SIT_DISPLAYFRAME //ライブプレビュービットマップを設定
	DeleteObject hbmp_livepre
	
	gsel oldbufferid
return



[前へ] [戻る] [次へ]

(C)2019 inonote / 無断転載禁止