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);
}