アクティブでない場合でも、アクティブであるかのように Aero に境界のないウィンドウを描画させるにはどうすればよいですか? 質問する

アクティブでない場合でも、アクティブであるかのように Aero に境界のないウィンドウを描画させるにはどうすればよいですか? 質問する

Windows 7 のタスクバーと同じ効果を実現したいのですが、
次の質問を調べました:ウィンドウをアクティブに保つ
これはうまく機能しますが、ウィンドウに非クライアント領域がある場合のみです。

私のウィンドウには境界がなく、そのコンテンツ (黒い背景のみ) は、何をしても非アクティブとしてレンダリングされます。

ウィンドウ フラグを Windows 7 のタスクバーと同じように設定しましたが、効果はありませんでした。

現時点で私が考えているのは、境界線を描いて切り取るだけですが、私が望むものを実現するより良い方法はあるでしょうか?

編集1:
クリッピングは機能しませんでした。境界をクリッピングした後、ウィンドウのコンテンツは非アクティブ ウィンドウとしてレンダリングされました。それでは、Windows 7 のタスク バーは一体どのように機能するのでしょうか?

編集2:
自分自身をより良く説明するためにいくつかの写真を追加します。次のウィンドウ コンテンツの背景は黒です。

これは非アクティブなウィンドウです (コンテンツは少し暗くレンダリングされます)。非アクティブウィンドウ

これはアクティブなウィンドウです:
アクティブウィンドウ

ウィンドウにクライアント領域がない場合、コンテンツは常に非アクティブ ウィンドウとしてレンダリングされますが、Windows のタスクバーは常にアクティブ ウィンドウとしてレンダリングされ、NC 領域はありません (少なくとも spy++ によると)。これを模倣しようとしています。

編集3:
最近の発見を共有します。explorer.exe のメイン ウィンドウはフレームレスで、次のフラグがあります。エクスプローラー画像パラメータ

私はエクスプローラーのプロセス dwmapi.dll のエクスポートされた関数を詳しく調べました:エクスプローラー dwmapi.dll エクスポート関数

私と同じように、DwmEnableBlurBehindWindow を使用します。
文書化されていない序数関数を確認しましたが、Aero グラスをアクティブとしてレンダリングすることに関係するものはありませんでした。

DWM ルールがエクスプローラーに適用されないのでしょうか?

ベストアンサー1

ちょっと難しいですが、
「DwmSetWindowAttribute」API を使用して NCRenderingPolicy を Enabled に設定します。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa969524(v=vs.85).aspx

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);

    [Flags]
    public enum DwmWindowAttribute
    {
        NCRenderingEnabled = 1,
        NCRenderingPolicy,
        TransitionsForceDisabled,
        AllowNCPaint,
        CaptionButtonBounds,
        NonClientRtlLayout,
        ForceIconicRepresentation,
        Flip3DPolicy,
        ExtendedFrameBounds,
        HasIconicBitmap,
        DisallowPeek,
        ExcludedFromPeek,
        Last
    }

    [Flags]
    public enum DwmNCRenderingPolicy
    {
        UseWindowStyle,
        Disabled,
        Enabled,
        Last
    }

    public static bool SetNCRenderingActive(IntPtr Handle)
    {
        int renderPolicy = (int)DwmNCRenderingPolicy.Enabled;            
        return (DwmSetWindowAttribute(Handle, (int)DwmWindowAttribute.NCRenderingPolicy, ref renderPolicy, sizeof(int)  ) == 0);
    }

おすすめ記事