• 0

[C#/C++] Keep window visible while using Aero Peek


Question

Hi,

I'm currently trying to develop my own mini-"sidebar" using C# and WPF since the Windows Sidebar framework is simply too restrictive to use WPF.

The main problem here is that when using Aero Peek in Windows 7, my "gadget window" of course disappears along with the other windows.

Now my question is, is there a known way to keep my window visible just like the Sidebar Gadgets when using Aero Peek?

Has anybody ever found out how the sidebar manages this? (Special API call, special Window Message, etc)

I'm sure other developers would appreciate this info as well.

Thanks in advance ;)

-Simon

7 answers to this question

Recommended Posts

  • 0
  ZeroSkyX said:
Hi,

I'm currently trying to develop my own mini-"sidebar" using C# and WPF since the Windows Sidebar framework is simply too restrictive to use WPF.

The main problem here is that when using Aero Peek in Windows 7, my "gadget window" of course disappears along with the other windows.

Now my question is, is there a known way to keep my window visible just like the Sidebar Gadgets when using Aero Peek?

Has anybody ever found out how the sidebar manages this? (Special API call, special Window Message, etc)

I'm sure other developers would appreciate this info as well.

Thanks in advance ;)

-Simon

This will do it perfectly:

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

[Flags]
public enum DWMWINDOWATTRIBUTE
{
	DWMWA_NCRENDERING_ENABLED = 1, 
	DWMWA_NCRENDERING_POLICY, 
	DWMWA_TRANSITIONS_FORCEDISABLED, 
	DWMWA_ALLOW_NCPAINT, 
	DWMWA_CAPTION_BUTTON_BOUNDS, 
	DWMWA_NONCLIENT_RTL_LAYOUT, 
	DWMWA_FORCE_ICONIC_REPRESENTATION, 
	DWMWA_FLIP3D_POLICY, 
	DWMWA_EXTENDED_FRAME_BOUNDS, 
	DWMWA_HAS_ICONIC_BITMAP,
	DWMWA_DISALLOW_PEEK,
	DWMWA_EXCLUDED_FROM_PEEK,
	DWMWA_LAST
}

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

void RemoveFromAeroPeek(IntPtr Hwnd) //Hwnd is the handle to your window
{
	int renderPolicy = (int)DWMNCRenderingPolicy.Enabled;
	DWM.DwmSetWindowAttribute(Handle, (int)DWMWINDOWATTRIBUTE.DWMWA_EXCLUDED_FROM_PEEK, ref renderPolicy, sizeof(int));
}

  • 0

This should do it:

	<DllImport("dwmapi.dll")>Public Shared Function DwmSetWindowAttribute(ByVal hwnd As IntPtr, ByVal attr As Integer, ByRef attrValue As Integer, ByVal attrSize As Integer) As Integer
	End Function

	<Flags()> _
Public Enum DWMWINDOWATTRIBUTE
 	DWMWA_NCRENDERING_ENABLED = 1
 	DWMWA_NCRENDERING_POLICY
 	DWMWA_TRANSITIONS_FORCEDISABLED
 	DWMWA_ALLOW_NCPAINT
 	DWMWA_CAPTION_BUTTON_BOUNDS
 	DWMWA_NONCLIENT_RTL_LAYOUT
 	DWMWA_FORCE_ICONIC_REPRESENTATION
 	DWMWA_FLIP3D_POLICY
 	DWMWA_EXTENDED_FRAME_BOUNDS
 	DWMWA_HAS_ICONIC_BITMAP
 	DWMWA_DISALLOW_PEEK
 	DWMWA_EXCLUDED_FROM_PEEK
 	DWMWA_LAST
	End Enum

	<Flags()> _
Public Enum DWMNCRenderingPolicy
 	UseWindowStyle
 	Disabled
 	Enabled
 	Last
	End Enum

	Public Sub RemoveFromAeroPeek(ByVal Hwnd As IntPtr) 'Hwnd is the handle to your window
 	Dim renderPolicy As Integer = DWMNCRenderingPolicy.Enabled
 	DwmSetWindowAttribute(Hwnd, DWMWINDOWATTRIBUTE.DWMWA_EXCLUDED_FROM_PEEK, renderPolicy, Marshal.SizeOf(GetType(Integer)))
	End Sub

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.