2011-11-15 21 views
24

私はWindows 7のタスクバーと同じ効果を得たいと思います。
私はこの質問を見てきました: Keep Window Looking Active
これは素晴らしいですが、ウィンドウにクライアント以外の領域がある場合にのみ有効です。どのようにAeroがアクティブであるかのように境界線のないウィンドウを描画するように強制できますか?

私のウィンドウはボーダーレスであり、その内容(黒い背景)は、私が何をしていても非アクティブであるためレンダリングされます。

ウィンドウフラグをWindows 7のタスクバーと同じように設定しましたが、それは役に立ちませんでした。

私の唯一の唯一の考えは、境界線を描いてクリップすることです。私が望むものを達成するためのよりよい方法はありますか?

EDIT 1:
クリッピングは、ウィンドウの内容が非アクティブウィンドウとして表示された境界線をクリッピングした後、動作しませんでした。 どのようにWindows 7のタスクバーが機能しますか?

EDIT2:
より良い自分自身を説明するためにいくつかの写真を追加するには、以下のウィンドウの内容は、黒の背景です。

(内容はちょっと暗いレンダリングされる)、非アクティブウィンドウの

:ウィンドウは、コンテンツが常に非アクティブウィンドウとして表示されて何のクライアント領域を持っていない場合は
Active window

:アクティブウィンドウだ Inactive window

ウィンドウのタスクバーは常にアクティブウィンドウとしてレンダリングされ、NCエリアはありません(少なくともspy ++によると)。それが私が模倣しようとしていることです。

EDIT3:
最近のディスカッションを共有しています。 explorer.exeのメインウィンドウはフレームレスで、以下のフラグがあります Explorer image parameters

私は、エクスプローラのプロセスに潜っエクスポート機能をdwmapi.dll: Explorer dwmapi.dll exported functions

それは私が同じように、DwmEnableBlurBehindWindowを使用しています。
私は文書化されていない序数関数をチェックしましたが、それらのどれもアクティブなガラスをアクティブにすることには関係しません。

DWMルールはエクスプローラには適用されませんか?

+0

どのようにボーダーレスウィンドウがアクティブで気づくのですか? – Dani

+0

もっと明瞭になるように写真をいくつか追加しました。 – Omer

+0

最後の段落で「ウィンドウにクライアント領域がない場合、コンテンツは常に非アクティブウィンドウとしてレンダリングされます」と書かれています。ボーダーレスウィンドウはアクティブでも無効なウィンドウのように見えます。 – Omer

答えて

2

トリッキーなもの..
"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); 
    } 
関連する問題