Feedback

C# - Schiebeleiste für Fenster erstellen

Veröffentlicht von am 29.12.2012
(1 Bewertungen)
In einigen Programmen kann man ein Fenster an stellen außerhalb des Rahmens verschieben. Dieses Snippet sorgt für den gleichen Effekt.
Dieser Code muss im MouseDown-Event eingefügt werden, damit es funktioniert.
Übergeben werden muss das Handle des zu verschiebenden Fensters.
//WPF:

DoNonClientAreaDragging(new WindowInteropHelper(Application.Current.MainWindow).Handle);
//Windows Forms:
DoNonClientAreaDragging(this.Handle);


Der Code basiert auf einem Trick. Wenn das MouseDown-Event ausgelöst wird, dann ist die Maustaste logischerweise gedrückt. Dann wird der Focus wieder entfernt, was zur Folge hat, das die Maus angeblich nicht mehr gedrückt ist. Danach wird Windows mitgeteilt, das die Maus über dem Rahmen gedrückt wurde. Also bei einer Bewegung das Fenster verschoben wird. Beim Loslassen der Maus verliert Sie den Fokus wieder und alles läuft normal weiter.

Dieser Code hat den Vorteil, das Windows-Eigene Mechanismen wie beispielsweise Snap weiterhin funktionsfähig sind.

Hinweis: Für WPF-Fenstrer gibt es die DragMove-Methode.
private const int WM_NCLBUTTONDOWN = 0x00A1;
private const int HTCAPTION = 2;

[DllImportAttribute("user32.dll")]
private static extern int SendMessage(IntPtr hwnd, int msg, int wparam, int lparam);
[DllImportAttribute("user32.dll")]
private static extern bool ReleaseCapture();

public static void DoNonClientAreaDragging(IntPtr hwnd)
{
    ReleaseCapture();
    SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);
}

5 Kommentare zum Snippet

dariusarnold schrieb am 02.01.2013:
Sieh' dir mal <a href="http://www.tsql.de/csharp/csharp_fenster_ohne_titelleiste_verschieben">diesen</a> Code an. Ist denke ich etwas eleganter, als das Programm so "zu veräppeln"!

Die beiden Codeteile einfach in den MouseDown und MouseMove-Events des elemnts einfügen mit dem man das fenster verschieben können soll. :)
dariusarnold schrieb am 02.01.2013:
Schade, ich dachte die Komentare akzeptieren html tags genau so, wie auch die snippets. Naja.. Den Link nochmal so:

http://www.tsql.de/csharp/csharp_fenster_ohne_titelleiste_verschieben
Koopakiller schrieb am 09.02.2013:
Mein Code bietet allerdings Vorteile, und zwar:
1. Der Code funktioniert auch unter WPF, der verlinkte Code kann zwar übersetzt werden, jedoch scheint es da ein paar Probleme zu geben, habe es probiert
2. Die Maus springt nicht ständig weg, beim Mouse-Down

Der Code veräppelt zwar Windows (nicht das Programm), verschiebt das Fenster aber auf die selbe Weise wie Windows, macht ja letzten Endes auch Windows. Eleganter ist Ansichtssache, ich benutze Windowsfunktionen recht gerne für solche Sachen, warum das Rad neu erfinden?
In hinsicht auf den Leistungsverbrauch denke ich mal ist ein zugriff auf bereits existierende Funktionen der WinAPI nicht so "resourcenfressend" wie alles selbst zu managen. Wenn man auf Leistungsschwachen Computern das Fenster mit meiner Methode verschiebt, dann läufts noch so flüssig wie es bei anderen Fenstern laufen würde. Bei der anderen Methode hängt es etwas hinterher.
(Ich weiß, ich bin etwas perfektionistisch aber es kann auch Vorteile haben ;))
Koopakiller schrieb am 07.06.2013:
Mir ist gerade etwas aufgefallen, warum mein Code besser ist als über .NET zu gehen. Durch diesen Code sind Funktionen wie Snap nach wie vor aktiv.

Wenn du das Fenster an die Oberkannte des Bildschirmsschiebst wird es sich bei meiner Methode und beim Standartfenster maximieren. Bei dem verlinkten Artikel passiert nichts.
dariusarnold schrieb am 07.06.2013:
Na dann.. ;D
 

Logge dich ein, um hier zu kommentieren!