Ein rahmenloses Fenster, wenn ich mich nicht irre, ist so gekennzeichnet, dass es kein Systemmenü anbietet und dass es nicht in der Taskleiste erscheint.
Die Tatsache, dass ein bestimmtes Fenster keinen Rahmen hat und nicht in der Taskleiste angezeigt wird, ist das Ergebnis der auf dem Fenster gesetzten Style-Flags. Diese speziellen Style-Flags können mit den API-Aufrufen GetWindowLong
und SetWindowLong
gesetzt werden. Allerdings muss man vorsichtig sein, da bestimmte Styles einfach nicht zusammenarbeiten.
Im Laufe der Jahre habe ich eine Reihe von benutzerdefinierten Steuerelementen geschrieben und bin ständig darum bemüht, dass Fenster zu etwas werden, für das sie ursprünglich nicht gedacht waren.
Zum Beispiel habe ich mein eigenes Dropdown-Steuerelement geschrieben, bei dem ich ein Fenster benötigt habe, das sich wie ein Popup verhält und nicht aktiviert wird.
Der folgende Code wird das tun. Beachten Sie, dass der Code im Ereignishandler OnHandleCreated
erscheint. Dies liegt daran, dass die Flags unmittelbar nach dem Einrichten des Griffs geändert werden müssen, was anzeigt, dass Windows bereits festgelegt hat, was es für die Flags halten sollte.
using System.Runtime.InteropServices;
protected override void OnHandleCreated(EventArgs e) {
uint dwWindowEigenschaft;
User32.SetParent(this.Handle, IntPtr.Zero);
dwWindowEigenschaft = User32.GetWindowLong( this.Handle, User32.GWL.EXSTYLE );
dwWindowEigenschaft = dwWindowEigenschaft | (uint)User32.WSEX.TOOLWINDOW | (uint)User32.WSEX.NOACTIVATE;
User32.SetWindowLong( this.Handle, User32.GWL.EXSTYLE, dwWindowEigenschaft );
dwWindowEigenschaft = User32.GetWindowLong( this.Handle, User32.GWL.STYLE );
dwWindowEigenschaft = ( dwWindowEigenschaft & ~(uint)User32.WS.CHILD ) | (uint)User32.WS.POPUP;
User32.SetWindowLong( this.Handle, User32.GWL.STYLE, dwWindowEigenschaft );
base.OnHandleCreated (e);
}
// Dies ist ein Fragment meines User32-Bibliothek-Wrappers, der für das vorherige Code-Segment benötigt wird.
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,
}
}
Leider kann der SysMenu
-Stil nicht ohne Verwendung des Caption
-Stils gesetzt werden, daher kann ich nicht sagen, ob dies ein Problem in Ihrer Implementierung ist.
Sie können die ursprüngliche Stil-Liste und die erweiterte Stil-Liste unter diesen beiden Links überprüfen:
Fensterstile
CreateWindowEx