Donnerstag, 15. Juli 2010

Taskleiste verstecken

Wollen wir mit C# die Taskleiste ein- / oder ausblenden (meistens wollen Programmierer diese verstecken), benötigen wir die WinAPI.
Um das Fensterhandle (sozusagen die Erkennungsmarke) der Taskleiste zu erhalten, wird die Funktion FindWindow() benötigt. Näheres auf diesem Blog zu dieser Funktion und warum wir in diesem Fall nicht die .Net Klasse System.Diagnostics.Process verwenden können, könnt ihr im vorigen Post lesen.
Wir können die Taskleiste nun mit unserem Programm "greifen" und manipulieren, als nächstes wollen wir sie ein- / ausblenden. Hierzu wird die API - Funktion ShowWindow() benötigt.
Sie erwartet zwei Parameter: Als erstes einen Integer Wert, welcher das Fensterhandle angibt und als zweites einen weiteren Integer Wert, der die durchzuführende Aktion beschreibt. Alle möglichen Werte können hier nachgelesen werden. Wir benötigen die Werte 0 zum Verstecken und 1 zum Anzeigen des Fensters, weitere mögliche sind zum Beispiel 3 (Maximieren) und 6 (Minimieren).
Folgendes Beispielprogramm versteckt die Taskleiste beim Laden des Formulars (System.Runtime.InteropServices für den DLL - Import muss mittels using eingebunden sein):

        [DllImport("user32.dll")]
        private static extern int FindWindow(string className, string windowText);

        [DllImport("user32.dll")]
        private static extern int ShowWindow(int hwnd, int command);

        private void Form1_Load(object sender, EventArgs e)
        {
            int TaskbarWindowHandle = FindWindow("Shell_TrayWnd", "");
            ShowWindow(TaskbarWindowHandle, 0);
        }

Kommentare:

  1. Hi,

    aber warum sollte man die TaskLeiste verstecken wollen? Würden wir das machen, wär das ein Sicherheitsproblem in der Software, da man ja nicht auf das System zugreifen soll ;)

    AntwortenLöschen
    Antworten
    1. Auf den Embedded Systemen will man gerade dem User alle Systemzugriffe verbieten.

      Löschen
  2. Hi,

    funktioniert super.
    aber ich bräuchte die Function FindWindow() für ein anderes Programm, als die Taskleiste. Hast du mir nen Tip, wie ich an den className dieses Programms ran komme? Oder wie kann ich das lösen?

    AntwortenLöschen
  3. Hi,

    um direkt an den className eines Programms heranzukommen fällt mir jetzt so kein Weg ein,
    allerdings wird ja die Methode FindWindow() nur benötigt, um das Fenster Handle herauszufinden (ein integer Wert).
    Mit diesem kannst du dann wie im Post gezeigt Methoden wie ShowWindow() aufrufen.
    Du kannst nun z.B. mit der Methode EnumWindows() alle Handles der laufenden Prozesse auslesen und so vielleicht das richtige Fenster auswählen.
    Allerdings ändern sich die Windows Handles bei jedem Programmstart, du müsstest also jedes Mal diese Methode anwenden.
    Interessante Infos hierzu gibts unter http://www.pinvoke.net/default.aspx/user32.enumwindows .

    Alternativ kannst du auch nach bestimmten Teilen im Programmtitel o.ä. suchen, z.B. über die Methode FindWindowEx().
    In einfachen Fällen hilft auch die .Net eigene Methode, im oben verlinkten Post (http://csharp-tricks.blogspot.com/2010/07/fenster-auswahlen-mit-findwindow.html) wird dies genauer erläutert.

    Wenn's nicht klappt kannst du dich ja nochmal melden und sagen, um welches Programm es sich handelt.

    AntwortenLöschen