Laden...

Form/Control auf Windows-7-Desktop verankern

Erstellt von kenny197902 vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.452 Views
K
kenny197902 Themenstarter:in
6 Beiträge seit 2008
vor 11 Jahren
Form/Control auf Windows-7-Desktop verankern

Hallo.
Ich versuche vergeblich ein Form-Element auf einem Windows 7-Aero Desktop zu verankern. Dazu hatte ich mir einige Seiten aus dem Internet rausgesucht, wo es angeblich funktionieren soll, jedoch funktioniert es bei mir nicht. Hier mal mein Code:


using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace Countdown
{
    class root
    {
        [DllImport("user32.dll", SetLastError = true)]
        static extern int SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong);

        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindow(string lpWindowClass, string lpWindowName);

        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);

        const int HWND_DESKTOP = 0;

        static Form desktopForm = new Form();
        [System.STAThread] static void Main()
            {
            Application.EnableVisualStyles();

            desktopForm.Size = new Size(100, 100);
            desktopForm.Location = new Point(10, 10);
            desktopForm.ShowInTaskbar = false; // <-- nicht als Control / UserControl
            desktopForm.FormBorderStyle = FormBorderStyle.None; // <-- nicht als Control / UserControl

            // Nen Label zum Test
            Label a = new Label();
            a.Location = new Point(10, 10);
            a.Text = "Test";
            desktopForm.Controls.Add(a);
            
            desktopForm.Show();

            IntPtr hprog = FindWindowEx(FindWindowEx(FindWindow("ProgMan", "Program Manager"), IntPtr.Zero, "SHELLDLL_DefView", ""), IntPtr.Zero, "SysListView32", "FolderView");
            SetWindowLong(desktopForm.Handle, HWND_DESKTOP, hprog);
            desktopForm.Visible = true;

            Application.Run();
        
            }

    }
}

Die Anwendung ist unter Net-Framwork 3.5 erstellt als leeres Projekt mit VC# 2008, hab diese als Windows-Forms-Anwendung danach umgestellt. Ich habe es als Form-Element versucht, genauso auch als (User)-Control. Leider befindet sich aber das Element beim Start nicht auf dem Desktop angebunden, sondern ganz oben wie ein normales Programmfenster. Beim versuch als Control muss ich jedoch sagen, das es nur unter "HWND_DESKTOP = -8" (entspricht GWL_HWNDPARENT) erscheint, sondern genauso wie ne normale Anwendung und zusätzlich eben in der Taskbar (was es ja auch nicht soll). Das selbe Problem tritt eben auch als Form() auf, nur da verwende ich HWND_DESKTOP=0 und es taucht durch "ShowInTaskbar = false" eben da nicht auf.

Wisst ihr, was ich da falsch mache? Oder gibts einfachere Alternativen, eine Desktopanwendung zu erstellen?

Achtung: Das Verhalten von Windows 7 und Windows XP ist anders. Also schreibt bitte nicht sowas wie:

SetParent(desktopform.Handle, FindWindow("ProgMan", null));

das klappt unter Windows XP einwandfrei aber nicht unter Windows 7 mit Aero.

W
196 Beiträge seit 2008
vor 11 Jahren

Wenn der FormBorderStyle auf None gesetzt wird, kommt man mit dem überschreiben der folgenden Methoden des Forms schon ziemlich weit:


        protected override void OnActivated(EventArgs e)
        {
            base.OnActivated(e);
            SendToBack();
        }

        protected override void OnDeactivate(EventArgs e)
        {
            SendToBack();
            base.OnDeactivate(e);
        }

        protected override void OnGotFocus(EventArgs e)
        {
            base.OnGotFocus(e);
            SendToBack();
        }

Allerdings verschwindet das Fenster beim drücken von WIN+D dann trotzdem noch. Kann man aber evtl. auch noch irgendwie abfangen...

Oder Du schreibst gleich ein Widget (Anleitungen dazu gibt's im INet)…

P
219 Beiträge seit 2008
vor 11 Jahren

Hey, interessantes Thema, sowas suche ich auch! Möchte mir allerlei Infos auf dem Desktop anzeigen lassen, damit ich sie ständig im Überblick behalte während ich mit dem PC arbeite.

Hast du das Problem schon gelöst mittlerweile?

C# - Eine Form auf den Desktop kleben - BottomMost

Dieser Code funktioniert bei mir, allerdings nicht wenn das Fenster transparent ist! Eigentlich will ich mir einfach nur ein paar eng aneinanderliegende Buttons auf den Desktop legen um ihn mit ein bisschen Steuerungsfunktionalität zu versehen. Darf dann halt keine Icons drunter verschwinden lassen.

Jedoch sieht das doof aus wenn das Fenster dabei farbig ist, ich hätte gern, dass man den Desktophintergrund noch hindurchsieht.