2011-11-15 29 views
24

Tôi muốn có tác dụng tương tự như thanh tác vụ của Windows 7.
Tôi đã xem xét câu hỏi này: Keep Window Looking Active
Nó hoạt động tuyệt vời nhưng chỉ khi cửa sổ có khu vực không phải khách hàng.Làm thế nào tôi có thể buộc Aero vẽ một cửa sổ không viền như thể nó đang hoạt động, ngay cả khi nó không?

Cửa sổ của tôi không biên giới và nội dung của nó (chỉ nền đen) được hiển thị vì nó không hoạt động, bất kể tôi làm gì.

Tôi đã đặt cờ cửa sổ của mình giống như thanh tác vụ Windows 7 nhưng nó không giúp ích gì.

Suy nghĩ duy nhất của tôi vào lúc này là vẽ nó bằng đường viền và chỉ cắt chúng, có cách nào tốt hơn để đạt được những gì tôi muốn không?

CHỈNH SỬA 1:
Cắt bớt không hoạt động, sau khi cắt đường viền nội dung cửa sổ được hiển thị dưới dạng cửa sổ không hoạt động. Cửa sổ tác vụ của Windows 7 hoạt động như thế nào?

EDIT2:
Thêm một số ảnh để giải thích rõ hơn, Nội dung cửa sổ sau đây là nền đen.

Đó là một cửa sổ hoạt động (nội dung được trả lại kinda tối): Inactive window

Đó là một cửa sổ đang hoạt động:
Active window

Nếu cửa sổ không có khu vực khách hàng nội dung luôn được trả lại như cửa sổ không hoạt động tuy nhiên cửa sổ Taskbar luôn được hiển thị dưới dạng cửa sổ hoạt động và nó không có bất kỳ vùng NC nào (ít nhất là theo spy ++). Đó là những gì tôi đang cố bắt chước.

EDIT3:
Chia sẻ những khám phá gần đây của tôi. cửa sổ explorer.exe chính là frameless và có những lá cờ sau: Explorer image parameters

tôi lặn vào quá trình của nhà thám hiểm DWMAPI.dll xuất khẩu chức năng: Explorer dwmapi.dll exported functions

nó sử dụng DwmEnableBlurBehindWindow, cũng giống như tôi làm.
Tôi đã kiểm tra các hàm thứ tự không có giấy tờ và không có hàm nào trong số chúng có liên quan đến việc hiển thị kính aero làm hoạt động.

Có thể quy tắc DWM không áp dụng cho trình khám phá không?

+0

Làm thế nào để bạn nhận thấy một biên giới ít cửa sổ không hoạt động? – Dani

+0

Đã thêm một số ảnh để rõ ràng hơn. – Omer

+0

Tôi đã viết ở đoạn cuối "Nếu cửa sổ không có khu vực khách, nội dung luôn được hiển thị dưới dạng cửa sổ không hoạt động", một cửa sổ không viền sẽ trông giống như cửa sổ không hoạt động, ngay cả khi nó hoạt động. – Omer

Trả lời

2

Tricky one ..
đặt NCRenderingPolicy thành Đã bật với API "DwmSetWindowAttribute".
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); 
    } 
Các vấn đề liên quan