Laden...

Taskbleiste userDLL32 gibt es nicht?

Erstellt von dgroeser vor 17 Jahren Letzter Beitrag vor 17 Jahren 3.943 Views
D
dgroeser Themenstarter:in
135 Beiträge seit 2006
vor 17 Jahren
Taskbleiste userDLL32 gibt es nicht?

Hallo,

möchte wenn mein Programm auf einen CE automatisch gestartet wird, das die Taskbar automatisch verschwindet.

Gibt es da eine Möglichkeit?

Beste Grüße

Dennis

S
95 Beiträge seit 2006
vor 17 Jahren

Hi

unterm Framework gibts die Property

Form.ShowInTaskbar = false

Allerdings kann ich ned sagen, ob das unter CE genauso aussieht 🙂

greetz

Das größte Misstrauensvotum gegen Gott ist ein Blitzableiter auf dem Kirchturm! 😁

1.271 Beiträge seit 2005
vor 17 Jahren

@Syrinx: Ich glaub du hast die Frage falsch verstanden: dgroeser möchte nicht wissen, wie er verhindert, dass das Form in der Taskbar angezeigt wird, sondern möchte die ganze Taskbar ausblenden.

@dgroeser: Das musst du, glaub ich, über die WinAPI machen. Wie das damit auf CE läuft, weiß ich aber nicht.

A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee

Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.

915 Beiträge seit 2006
vor 17 Jahren

Hallo hatte das selbe Problem, allerdings wollte ich den Effekt nur wenn das MDI Container Fenster maximiert wird.

Aber aufgepasst, ich habe die Control Boxen selbst gemalt, auf einer normalen Form sind die nicht mehr sichtbar.



public enum WindowMessages
    {

        WM_SYSCOMMAND = 0x0112
    }

public enum SystemCommands
    {
      
        SC_MAXIMIZE = 0xF030
    }

protected override void WndProc(ref Message m)
        {
            if (m.Msg == (int) WindowMessages.WM_SYSCOMMAND)
            {

                if (m.WParam.ToInt32() == (int)SystemCommands.SC_MAXIMIZE)
                    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
                else
                    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable;
            }

            base.WndProc(ref m);
        }

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

1.271 Beiträge seit 2005
vor 17 Jahren

@Andreas.May: Ich glaube du hast die Frage auch falsch gestanden. Als Taskbar verstehe ich die (Task-)Leiste, die (im Normalfall) unten über die gesamte Desktop-Breite angezeigt wird un in der sich der Start-Button mit dem Windows-Symbol befindet.

Wenn ich mein, alle verstehen die Frage falsch, kann natürlich auch sein, dass ich sie falsch versteh 😉.

A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee

Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.

D
dgroeser Themenstarter:in
135 Beiträge seit 2006
vor 17 Jahren

genau die will ich ausblenden bzw. das Fenster einfach davor damit mehr platz auf der form ist?

915 Beiträge seit 2006
vor 17 Jahren

Original von dgroeser
genau die will ich ausblenden bzw. das Fenster einfach davor damit mehr platz auf der form ist?

Kopier mal den Code in deine Form.
Klicke dann mal auf den Maximieren Button deines Fensters.

Die Taskleiste wird überblendet und ein Formular ist wie im Vollbildmodus.
Ist einfach ein kleiner Trick. Nur die Controls der Titlebar verschwinden.

/PS

Habe es in VS2005 erstellt und Probiert, evtl. liegt es ja daran das es nicht geht?

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

D
dgroeser Themenstarter:in
135 Beiträge seit 2006
vor 17 Jahren

Das mit maximieren funktioniert nicht

915 Beiträge seit 2006
vor 17 Jahren
Global system hook

Hm, schade.

Ansonsten über Spy++ mal die Taskbar auswählen, schauen wie sich das Ding verhält. Wüde es über Window Subclassing dann versuchen.

Denk nur dran das WINSDK gut anzusehen, wirst statt einen intPtr dafür einen Delegate für den Callback brauchen.


public delegate void HookProcessedHandler(int code, 
                                      UIntPtr wparam, IntPtr lparam)

Aber vielleicht hat jemand noch eine etwas einfacherere / schönerere Lösung für das Problem.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

D
dgroeser Themenstarter:in
135 Beiträge seit 2006
vor 17 Jahren

Und das ganze auf Deutsch hast du einen Code den ich komplett einbinden kann der auch funktioniert?

3.170 Beiträge seit 2006
vor 17 Jahren

Hallo,
Schmeiß einfach das MainMenu aus Deiner Form, dann ist die Taskbar weg.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

915 Beiträge seit 2006
vor 17 Jahren

Also hier die Lösung, geht auch ohne Subclassing sehr einfach.



   using System.Runtime.InteropServices;

        [DllImport("user32.dll")]
        private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

        [DllImport("user32.dll")]
        private static extern bool GetWindowRect(IntPtr hWnd, out Rectangle lpRect);

        [DllImport("user32.dll")]
        static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X,
           int Y, int cx, int cy, uint uFlags);

        [Flags]
        public enum SWP
        {
            SWP_NOSIZE = 0x0001,
            SWP_NOMOVE = 0x0002,
            SWP_NOZORDER = 0x0004,
            SWP_NOREDRAW = 0x0008,
            SWP_NOACTIVATE = 0x0010,
            SWP_FRAMECHANGED = 0x0020,
            SWP_SHOWWINDOW = 0x0040,
            SWP_HIDEWINDOW = 0x0080,
            SWP_NOCOPYBITS = 0x0100,
            SWP_NOOWNERZORDER = 0x0200,
            SWP_NOSENDCHANGING = 0x0400,
            SWP_DEFERERASE = 0x2000,
            SWP_ASYNCWINDOWPOS = 0x4000
        }

        public static Rectangle m_oRec;

        public static bool HideTaskbar()
        {
            IntPtr Task = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Shell_TrayWnd", "");

            // falls der handle der taskbar nicht gefunden wurde
            if (Task == IntPtr.Zero)
                return false;

            // dieses rectangle einfach irgendwo merken damit die höhe später wiederhergestellt werden kann
            GetWindowRect(Task, out m_oRec);

            // setzt die Windows possition auf null und lässt die Taskbar verschwinden
            return SetWindowPos(Task, IntPtr.Zero, 0, 0, 0, 0, (uint)SWP.SWP_HIDEWINDOW);
        }

        public static bool ShowTaskbar(Rectangle _oRec)
        {
            // suche taskbar handle
            IntPtr Task = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Shell_TrayWnd", "");

            // falls der handle der taskbar nicht gefunden wurde
            if (Task == IntPtr.Zero)
                return false;

            // zeigt die taskbar wieder an
            return SetWindowPos(Task, IntPtr.Zero, _oRec.X, _oRec.Y, _oRec.Height, _oRec.Width, (uint)SWP.SWP_SHOWWINDOW;
        }


Brauchst das natürlich nicht static setzen, auch einfach dann beim TaskHide die ClientSize mit Hilfe von PointToScreen über die gesamte Bildschirm-Fläche legen..
Dafür war ich aber etwas zu faul🙂

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

D
dgroeser Themenstarter:in
135 Beiträge seit 2006
vor 17 Jahren

Wenn ich den Code einbinde kommt folgender Fehler

Can't find PInvoke DLL 'user32.dll'.

915 Beiträge seit 2006
vor 17 Jahren

Hmm, habe leider keinen Windows CE/Pocket-PC...
Hab es daher verpennt das es kein 'user32.dll' gibt, aber trotzdem kein Thema.

Ersetzt das einfach durch 'coredll.dll' dann sollte es funktionieren.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

D
dgroeser Themenstarter:in
135 Beiträge seit 2006
vor 17 Jahren

Ich bekomme bei diesen Code folgende Fehlermeldung

Can't find an Entry Point 'FindWindowEx' in a PInvoke DLL 'coredll.dl

Original von Andreas.May
Also hier die Lösung, geht auch ohne Subclassing sehr einfach.

  
  
   using System.Runtime.InteropServices;  
  
        [DllImport("user32.dll")]  
        private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);  
  
        [DllImport("user32.dll")]  
        private static extern bool GetWindowRect(IntPtr hWnd, out Rectangle lpRect);  
  
        [DllImport("user32.dll")]  
        static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X,  
           int Y, int cx, int cy, uint uFlags);  
  
        [Flags]  
        public enum SWP  
        {  
            SWP_NOSIZE = 0x0001,  
            SWP_NOMOVE = 0x0002,  
            SWP_NOZORDER = 0x0004,  
            SWP_NOREDRAW = 0x0008,  
            SWP_NOACTIVATE = 0x0010,  
            SWP_FRAMECHANGED = 0x0020,  
            SWP_SHOWWINDOW = 0x0040,  
            SWP_HIDEWINDOW = 0x0080,  
            SWP_NOCOPYBITS = 0x0100,  
            SWP_NOOWNERZORDER = 0x0200,  
            SWP_NOSENDCHANGING = 0x0400,  
            SWP_DEFERERASE = 0x2000,  
            SWP_ASYNCWINDOWPOS = 0x4000  
        }  
  
        public static Rectangle m_oRec;  
  
        public static bool HideTaskbar()  
        {  
            IntPtr Task = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Shell_TrayWnd", "");  
  
            // falls der handle der taskbar nicht gefunden wurde  
            if (Task == IntPtr.Zero)  
                return false;  
  
            // dieses rectangle einfach irgendwo merken damit die höhe später wiederhergestellt werden kann  
            GetWindowRect(Task, out m_oRec);  
  
            // setzt die Windows possition auf null und lässt die Taskbar verschwinden  
            return SetWindowPos(Task, IntPtr.Zero, 0, 0, 0, 0, (uint)SWP.SWP_HIDEWINDOW);  
        }  
  
        public static bool ShowTaskbar(Rectangle _oRec)  
        {  
            // suche taskbar handle  
            IntPtr Task = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Shell_TrayWnd", "");  
  
            // falls der handle der taskbar nicht gefunden wurde  
            if (Task == IntPtr.Zero)  
                return false;  
  
            // zeigt die taskbar wieder an  
            return SetWindowPos(Task, IntPtr.Zero, _oRec.X, _oRec.Y, _oRec.Height, _oRec.Width, (uint)SWP.SWP_SHOWWINDOW;  
        }  
  
  

Brauchst das natürlich nicht static setzen, auch einfach dann beim TaskHide die ClientSize mit Hilfe von PointToScreen über die gesamte Bildschirm-Fläche legen..
Dafür war ich aber etwas zu faul🙂

915 Beiträge seit 2006
vor 17 Jahren

Hrm, habe mal nachgeschaut leider wird FindWindowEx nicht für Windows CE supported 🙁

Fürchte musst dann einen anderen Lösungsansatz versuchen, nur ehrlich gesagt habe keine Ahnung wie es sonst ohne viele Probleme zu erzeugen sonst machbar wäre.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(