Окно без полей, если я не ошибаюсь, помечено так, что оно не предлагает системного меню и что оно не отображается на панели задач.
Тот факт, что какое-либо данное окно не имеет границы и не отображается на панели задач, является результатом флажков стиля, установленных в окне. Эти флаги стиля могут быть установлены с помощью вызовов API GetWindowLong и SetWindowLong. Однако вы должны быть осторожны, поскольку определенные стили просто не работают вместе.
Я написал несколько пользовательских элементов управления на протяжении многих лет, и я постоянно ухаживаю за окнами, чтобы стать тем, кем они изначально не предназначались. Например, я написал свой собственный выпадающий элемент управления, где мне нужно окно, чтобы вести себя как всплывающее окно, а не активировать. Следующий код будет делать это. Обратите внимание, что код появляется в обработчике событий OnHandleCreated. Это связано с тем, что флаги необходимо изменить сразу после установки дескриптора, что указывает на то, что Windows уже установила, что, по его мнению, должны быть флаги.
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", 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,
}
}
К сожалению, стиль SysMenu не может быть установлен без использования стиля Caption, поэтому я не могу сказать, если это является проблемой в вашей реализации.
Вы можете проверить оригинальный список стилей и список стилей расширения по этим двум ссылкам. http://msdn.microsoft.com/en-us/library/ms632600(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms632680(VS.85).aspx
«WS_SYSMENU: Создает окно, в котором есть окно в его строке заголовка. Также должен быть указан стиль WS_CAPTION». Да, это все.Это безграничная и беззаботная форма. – 2009-01-16 13:51:14