2011-11-15 26 views
24

我想要有与Windows 7任务栏相同的效果。
我在这个问题看过: Keep Window Looking Active
它的工作很好,但只有当窗口有非客户区。如何强制Aero绘制无边框窗口,即使它不是?

我的窗口无边框,它的内容(只是一个黑色背景)呈现为无效,无论我做什么。

我设置了我的窗口标志就像Windows 7任务栏,但它没有帮助。

我现在唯一的想法是用边框画出来,然后剪下来,有没有更好的方法来实现我想要的?

编辑1:
裁剪没有工作,裁剪窗口内容被渲染为活动窗口边框后。 地狱怎么做windows 7任务栏工程呢?

EDIT2:
添加一些照片来解释自己更好,下面的窗口内容是一个黑色的背景。

这是一个非活动窗口(内容呈现有点暗): Inactive window

这是一个活动窗口:
Active window

如果该窗口没有客户区的内容总是呈现为活动窗口然而,Windows任务栏总是呈现为活动窗口,并没有任何NC区域(至少根据spy ++)。这就是我想模仿的东西。

编辑3:
分享我最近的发现。 Explorer.exe的主窗口是无框,具有以下标志: Explorer image parameters

我跳入探险的过程dwmapi.dll文件导出的函数: Explorer dwmapi.dll exported functions

它使用DwmEnableBlurBehindWindow,就像我一样。
我检查了无证的序数函数,它们都没有与渲染航空玻璃作为活动相关。

难道是DWM规则不适用于资源管理器?

+0

你如何发现一个边界欠窗口是无效的? – Dani

+0

添加了一些照片更清晰。 – Omer

+0

我在最后一段中写道:“如果窗口没有客户区域,内容总是呈现为非活动窗口”,则无边界窗口看起来像不活动的窗口,即使它是活动的。 – Omer

回答

2

Tricky one ..
使用“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); 
    }