Окно без полей, если я не ошибаюсь, помечается так, что оно не предлагает системного меню и не отображается на панели задач.
Тот факт, что любое окно не имеет границы и не отображается на панели задач, является результатом установки флагов стиля в окне. Эти конкретные флаги стиля можно установить с помощью вызовов API GetWindowLong
и SetWindowLong
. Однако вы должны быть осторожны, так как некоторые стили просто не работают вместе.
Я написал несколько пользовательских элементов управления за эти годы, и я постоянно уговариваю окна стать такими, какими они изначально не были.
Например, я написал свой собственный выпадающий элемент управления, в котором мне нужно окно, которое будет вести себя как всплывающее окно, а не активироваться.
Следующий код сделает это. Обратите внимание, что код появляется в обработчике событий 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,
}
}
К сожалению, стиль SysMenu
нельзя установить без использования стиля Caption
, поэтому я не могу сказать, является ли это проблемой в вашей реализации.
Вы можете проверить исходный список стилей и список расширенных стилей по этим двум ссылкам:
Стили окон
CreateWindowEx