Wie kann man unterbinden, dass eine Form durch einen Klick auf das Icon in der Taskbar minimiert wird?

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Wie kann man unterbinden, dass eine Form durch einen Klick auf das Icon in der Taskbar minimiert wird?

    Moin Leute,

    ich habe ein Fenster, in dem in einem Live-Modus permanent Messungen durchgeführt werden.
    Wenn der Live-Modus aktiv ist, soll das Fenster nicht per Taskbar-Icon-Klick minimiert werden können,
    sondern nur durch einen Klick auf das Icon in der Titelzeile des Fensters.
    Dort wird dann der Live-Modus beendet und erst bei einem zweiten Klick das Fenster minimiert.

    Der Taskbar-Icon-Klick muss also erkannt werden, bevor .WindowState auf Minimized wechselt.

    Danke.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wenn es dir nur um den MinimizeButton geht dann könnte WndProc der richtige Ansatz sein.
    Spoiler anzeigen

    C#-Quellcode

    1. private int minimizeButtonClickCount = 0;
    2. protected override void WndProc(ref Message m)
    3. {
    4. const uint WM_SYSCOMMAND = 0x0112;
    5. const uint SC_MINIMIZE = 0xF020;
    6. const uint WM_NCLBUTTONDOWN = 0x00A1;
    7. if (m.Msg == WM_SYSCOMMAND && m.WParam.ToInt32() == SC_MINIMIZE)
    8. {
    9. if (minimizeButtonClickCount < 2)
    10. return;
    11. else
    12. minimizeButtonClickCount = 0;
    13. }
    14. else if (m.Msg == WM_NCLBUTTONDOWN)
    15. {
    16. Point p = PointToClient( new Point((int)m.LParam));
    17. Rectangle rectMouseClick = new Rectangle(p.X, p.Y, 10, 10);
    18. Rectangle rectMinizeButton = new Rectangle(ClientRectangle.Right - 115, ClientRectangle.Top - 20, 10, 10); // 115 ist bei mir die ungefähre Breite der TitleControls
    19. if (rectMouseClick.IntersectsWith(rectMinizeButton))
    20. ++minimizeButtonClickCount;
    21. }
    22. base.WndProc(ref m);
    23. }



    *Edit*
    Bei Shortcuts wie Win+d oder Win+m wird die Form aber dennoch minimiert.
    @Fakiz, hätt ich auch so gemacht, aber Zeitlich basiert:

    C#-Quellcode

    1. public partial class Form1 : Form {
    2. private long lastNonClientAreaLeftClick;
    3. public Form1() {
    4. InitializeComponent();
    5. }
    6. protected override void WndProc(ref Message m) {
    7. if (m.Msg == 161) { // WM_NCLBUTTONDOWN
    8. this.lastNonClientAreaLeftClick = DateTime.Now.Ticks;
    9. }
    10. if (m.Msg == 274) { // WM_SYSCOMMAND
    11. if (m.WParam.ToInt32() == 61_472) { // SC_MINIMIZE
    12. if (DateTime.Now.Ticks - this.lastNonClientAreaLeftClick > 200_000_0) { // Last non client area click within 200 milliseconds
    13. m.Result = IntPtr.Zero;
    14. return;
    15. }
    16. }
    17. }
    18. base.WndProc(ref m);
    19. }
    20. }
    @Fakiz Genau das.
    Den Zähler werfe ich raus, dafür ich stoppe den Live-Modus.
    Die Position des Minimize-Buttons ist noch genauer zu bestimmen und feddich.
    ====
    Win+d, Win+m sowie Klick unten ganz rechts in die Taskbar minimieren alle Fenster, da wird aber bei mir ebenfalls Live-Modus gestoppt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Folgendes kommt nicht infrage?
    Live-Modus, normal/maximiert -> ShowInTaskbar = false;
    Live-Modus, Fenster über GUI-MinimizingButton minimieren -> ShowInTaskbar = true;
    nicht-Live-Modus (?) -> ShowInTaskbar = false;
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Das ist wahrscheinlich die eleganteste Lösung für den Entwickler, aber für den Kunden wäre es verwirrend, wenn das Icon kommt und geht.
    Und das darf nicht sein. Wenn der Live-Modus durch den ersten Klick aufs Minimieren oder [X] beendet wird und ein zweiter Klick erforderlich ist, ist das OK.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!