5 Stimmen

Wie verhindere ich eine Größenänderung des Fensters, wenn die Workstation gesperrt und dann wieder freigegeben wird?

Wir haben eine Anwendung, die in Umgebungen mit mehreren Monitoren ausgeführt wird. Die Benutzer haben den Anwendungsdialog normalerweise auf mehrere Monitore verteilt.

Wenn der Benutzer die Arbeitsstation sperrt und dann wieder entsperrt, wird unsere Anwendung angewiesen, die Größe zu ändern.

Unsere Benutzer finden dieses Verhalten frustrierend, da sie dann einige Zeit damit verbringen, das vorherige Layout wiederherzustellen.

Wir sind uns noch nicht sicher, ob es der Grafiktreiber ist, der die Größenänderung anfordert, oder Windows. Hoffentlich wird durch diese Frage klarer, welche Komponente dafür verantwortlich ist,

Beliebte Anwendungen wie der (Datei-)Explorer und Firefox verhalten sich bei dieser Einstellung genauso. Einfach zu replizieren:

  1. Explorer öffnen ( Win+E )
    • Ziehen Sie das Explorer-Fenster so, dass es horizontal größer als 1 Bildschirm ist.
    • Arbeitsstation sperren ( Win+L ),
    • freischalten
    • die Anwendung sollte nun so angepasst werden, dass sie nur auf einem Bildschirm angezeigt wird

Wie verhindere ich eine Größenänderung des Fensters, wenn die Workstation gesperrt und dann wieder freigegeben wird?
Müssen wir Prüfungen für die (Ent-)Sperrung einprogrammieren?
Gibt es noch einen anderen Mechanismus, der uns nicht bekannt ist?

0 Stimmen

Kann jemand andere Stack Overflow-Tags vorschlagen, die geeignet sein könnten, um Leute zu erreichen, die Multimonitor-Sachen unter Windows machen?

1voto

Leif Carlsen Punkte 3547

Auf eine ähnliche Frage gibt es eine Antwort, die es Ihnen ermöglicht Wiederherstellung der Fenstergröße in einer .net-Anwendung, nachdem die Sitzung entsperrt wurde .

Jemand hat auf SuperUser im Wesentlichen die gleiche Frage gestellt, allerdings aus der Sicht Ihres Benutzers: Wie kann ich verhindern, dass sich die Größe von Windows ändert, wenn ich meinen Arbeitsplatzrechner sperre?

1voto

Mark Ransom Punkte 283960

Bevor die Größe des Fensters geändert wird, erhält die Anwendung eine WM_WINDOWPOSCHANGING Nachricht von Windows. Sie können diese Nachricht abfangen und die Parameter ändern, um das Fenster zu zwingen, an Ort und Stelle zu bleiben. Seien Sie vorsichtig, denn Sie erhalten die gleiche Meldung, wenn der Benutzer versucht, das Fenster zu verschieben oder seine Größe zu ändern. Wahrscheinlich auch, wenn es maximiert oder minimiert wird.

Bearbeiten: Sie können die Funktion WTSRegisterSessionNotification um zusätzliche Nachrichten zu erhalten. Die Nachrichten sind für einen schnellen Benutzerwechsel gedacht, aber der Sperrbildschirm ist in Windows als Systemsitzung implementiert.

1voto

ChrisF Punkte 130622

Ich habe die Lösung versucht, die in die Frage von Leif referenziert und festgestellt, dass die SessionSwitchReason.SessionUnlock wurde offenbar nach der Sperrung des Computers ausgelöst und nicht vorher. Dies bedeutete, dass die Fenstergröße und -position bereits zurückgesetzt worden waren, so dass die Größenänderung fehlschlug.

Daher musste ich eine andere Möglichkeit finden, die aktuelle Größe und den Standort zu speichern, bevor der Computer gesperrt wurde. Die einzige Möglichkeit, die ich sah, war das Abonnieren der ResizeEnd für Winforms-Anwendungen und aktualisieren Sie dort die "Pre-Lock"-Größe und -Position.

Ich war noch nicht in der Lage, es für WPF-Anwendungen zum Laufen zu bringen, weil WPF nicht über das Äquivalent von ResizeEnd (oder ich habe es noch nicht gefunden) und das Abonnieren von SizeChanged y LocationChanged ist nicht gut genug, da diese abgefeuert werden, wenn der Computer gesperrt ist, und außerdem die Größe und den Speicherort überschreiben.

Am Ende musste ich mich in das Windows-Ereignis ExitSizeMove einklinken, um die aktuelle Größe und Position zu speichern. Einzelheiten dazu, wie man sich in dieses Ereignis einhakt, finden Sie aquí :

private const int WM_EXITSIZEMOVE = 0x232;

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
    source.AddHook(new HwndSourceHook(WndProc));
}

private IntPtr WndProc(IntPtr hwnd, int msg,
                       IntPtr wParam, IntPtr lParam, ref bool handled)
{
    if (msg == WM_EXITSIZEMOVE)
    {
        // save location and size of window

        handled = true;
    }

    return IntPtr.Zero;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X