如果我没记错的话,无边框窗口会被标记为不提供系统菜单,并且不会出现在任务栏中。
任何给定窗口都没有边框并且没有出现在任务栏中的事实是窗口上设置的样式标志的结果。这些特定的样式标志可以使用GetWindowLong 和SetWindowLong API 调用来设置。但是,您必须小心,因为某些样式不能一起使用。
这些年来,我编写了许多自定义控件,并且我不断地哄着窗口成为它们原本不打算成为的东西。
例如,我编写了自己的下拉控件,我需要一个窗口来充当弹出窗口而不是激活。
下面的代码将做到这一点。请注意,代码出现在OnHandleCreated 事件处理程序中。这是因为在设置句柄后需要更改标志,这表明 Windows 已经设置了它认为应该设置的标志。
using System.Runtime.InteropServices;
protected override void OnHandleCreated(EventArgs e) {
uint dwWindowProperty;
User32.SetParent(this.Handle, IntPtr.Zero);
dwWindowProperty = User32.GetWindowLong( this.Handle, User32.GWL.EXSTYLE );
dwWindowProperty = dwWindowProperty | (uint)User32.WSEX.TOOLWINDOW | (uint)User32.WSEX.NOACTIVATE;
User32.SetWindowLong( this.Handle, User32.GWL.EXSTYLE, dwWindowProperty );
dwWindowProperty = User32.GetWindowLong( this.Handle, User32.GWL.STYLE );
dwWindowProperty = ( dwWindowProperty & ~(uint)User32.WS.CHILD ) | (uint)User32.WS.POPUP;
User32.SetWindowLong( this.Handle, User32.GWL.STYLE, dwWindowProperty );
base.OnHandleCreated (e);
}
//this is a fragment of my User32 library wrapper needed for the previous code segment.
class User32
{
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll", CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall )]
public static extern int SetWindowLong( IntPtr hWnd, User32.GWL gwlIndex, uint dwNewLong);
[DllImport("user32.dll", CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall )]
public static extern uint GetWindowLong( IntPtr hWnd, User32.GWL gwlIndex );
[FlagsAttribute]
public enum WS: uint {
POPUP = 0x80000000,
CHILD = 0x40000000,
}
public enum GWL {
STYLE = -16,
EXSTYLE = -20
}
[FlagsAttribute]
public enum WSEX: uint {
TOP = 0x0,
TOPMOST = 0x8,
TOOLWINDOW = 0x80,
NOACTIVATE = 0x08000000,
}
}
很遗憾,如果不使用 Caption 样式,就无法设置 SysMenu 样式,所以我不能说这是否是您的实现中的问题。
您可以在这两个链接查看原始样式列表和扩展样式列表:
Window Styles
CreateWindowEx