ウィンドウのドロップシャドウの寸法を知る必要があります。GetSystemMetrics WinAPI関数を介して値を受信しようとしましたが、渡すパラメーターが見つかりませんでした。この値をグローバルに(または単一のウィンドウハンドルに対して)取得する方法について何かアイデアはありますか?ドロップシャドウの幅はウィンドウの種類(ダイアログ/通常など)によって異なることを知っています。IbwはC#を使用してこの機能を実装しますが、C++でも問題ありません。
2 に答える
DWM APIを使用してドロップシャドウのサイズを把握する方法はありますが、ウィンドウが表示されるまで機能しません。
以前のバージョンのWindowsには、ClientRectとWindowRectがありました。しかし、Vistaがリリースされて以来、ExtendedFrameBoundsと呼ばれるウィンドウの3番目のRectがありました。3番目の長方形は、クライアント長方形よりも大きく、ウィンドウ長方形よりも小さく、ドロップシャドウが占める領域を除外します。
DwmGetWindowAttribute(hwnd, DWMWA_EXTENDED_FRAME_BOUNDS, &rect, sizeof(RECT))
拡張フレーム境界rectを読み取るために呼び出します。この関数はから<dwmapi.h>
のものであり、WindowsXP以前では使用できません。
ウィンドウが表示される前にこれを呼び出すと、誤った結果が得られることに注意してください。
編集:
拡張フレーム境界は物理的なピクセル座標であり、Windowsのスケーリング機能の影響を受けないことに注意してください。一致させるには、仮想座標に戻すか、仮想座標を物理座標に変換する必要がある場合があります。
私の知る限り、その情報を入手する方法はありません。WindowClippingsなどのプログラムは、スクリーンショットを撮り、後でシャドウの寸法にトリミングすることで問題を解決します。