2010-05-06 9 views
5

Ich habe diese Windows Forms-Anwendung, wo es im Infobereich sitzt. Klicken Sie auf das Symbol, um es nach vorne zu bringen, klicken Sie es erneut an (oder klicken Sie auf das Symbol App X) und senden Sie es zurück. Dies ist die Art von App, bei der das Fenster immer oben ist, wenn es durch Klicken auf das Symbol angezeigt wird (es ist jedoch optional).Wirklich nerviger Fehler mit TopMost-Eigenschaft in Windows Forms

Wenn Sie mit der rechten Maustaste auf das Symbol klicken, wird ein Kontextmenü angezeigt, in dem Sie die Option "Immer im Vordergrund" aktivieren können. Wenn die Anwendung zum ersten Mal gestartet wird, werden die App-Einstellungen aus einer XML-Datei gelesen und ich bin zu 99% der Meinung, dass dies so funktioniert, wie es sollte. Die Eigenschaft TopMost wird ordnungsgemäß gelesen (und geschrieben).

Nach einiger Zeit (Minuten, Stunden, Tage, was auch immer, ich normalerweise überwintern und selten herunterfahren) die TopMostfunktioniert nicht mehr. Ich ändere die Option nicht, ich glaube nicht, dass irgendetwas den Wert der Option ändert, aber ich klicke auf das Symbol des Benachrichtigungsbereichs und die App wird nicht angezeigt. Es erscheint, aber es ist im Hintergrund (es zeigt auf Alt + Tab), es ist nicht "immer oben" wie es sollte. Ich öffne das Kontextmenü, deaktiviere die Option (weil sie aktiviert ist) und aktiviere sie zurück und sie beginnt danach zu arbeiten. Die App ist jetzt "immer an der Spitze". Es kann jedoch jederzeit nach einiger Zeit diese Fähigkeit verlieren.

Ich kann nicht verstehen, warum das passiert und wie das passiert. Hat jemand eine Idee warum? Wenn nicht, irgendeine Idee, wie könnte ich versuchen, solches Verhalten zu debuggen?

EDIT:
Ich habe ein Stück Code, um eine MessageBox zu zeigen, wenn die TopMost Eigenschaft geändert wurde, um zu sehen, ob ich ein merkwürdiges Verhalten feststellen konnte, aber es war nicht gut. Es half nicht, weil das Formular mit TopMost = true war, aber es war immer noch im Hintergrund ...

Antwort

5

Es gibt mehr als nur ein "Top" -Fenster. Oben sagt nur "Vor allen nicht-obersten Fenstern".

Ich bin ziemlich sicher, dass eine Neuinitialisierung des Desktops (z. B. wenn Hibernation) eine andere SetWindowPos(hwnd, HWND_TOPMOST, ...) (was der zugrunde liegende Win32-API-Aufruf ist) erfordert.

Um dieses Problem zu umgehen, können Sie die Eigenschaft zurücksetzen und erneut festlegen, wenn Sie das Fenster anzeigen.

Eine andere Möglichkeit besteht darin, dass das Ausblenden des Fensters auch die Z-Reihenfolge ändert - entweder implizit, wie Win32 das implementiert, oder explizit in der Art, wie WinForms das Ausblenden/Anzeigen-Fenster aufruft.

+0

Ich weiß, dass meine App nicht das einzige oberste Fenster ist, aber Dinge wie Windows Explorer, Firefox und solche sind nicht oben und mein Fenster sollte auf denen oben sein. Was passiert nicht wegen dieser Panne. Ich deaktiviere und re-aktiviere die Option und es wird über sie wie es sollte. –

+0

Und ich glaube nicht, Winterschlaf ist das Problem. Ich habe gerade einen Schnelltest gemacht und den Rechner mit Explorer und Firefox geöffnet. Nach der Wiederherstellung ist meine App immer noch am obersten.Es muss in einer anderen Situation passieren ... –

+0

Haben Sie die von mir vorgeschlagene Problemumgehung versucht? (nachdem ich das Fenster gezeigt habe, setze es zurück und setze die "oberste" Eigenschaft) – peterchen

1

Wie peterchen habe ich auch keine Ahnung, wie die Ursache zu bekommen. Aber warum nicht ein bisschen einfacher?

Wenn Sie auf Ihr Icon klicken, werden Sie Ihr Fenster anzeigen und darauf vertrauen, dass TopMost noch aktiv ist. Rufen Sie einfach SetWindowPos() mit der aktuellen Einstellung an, bevor Sie das Fenster anzeigen. Dies sollte keine Leistungsprobleme (nur wenn der Benutzer auf das Symbol klickt) oder andere Nebeneffekte verursachen.

Ich weiß, es wäre toll, die Ursache zu finden, aber vielleicht ist es nicht wert, wenn Sie es mit einer solchen kleinen Problemumgehung lösen können.