Entwickler-Ecke

WinForms - Infos auf dem Desktop einblenden


Net_Hans - Mo 01.03.10 23:11
Titel: Infos auf dem Desktop einblenden
Hallo,

wie kann ich Informationen auf dem Desktop einblenden lassen, so das es aussieht, als wenn es auf dem Hintergrundbild geschrieben ist?
Ein Beispiel könnte man in diesem Beitrag sehen:
http://www.c-sharp-forum.de/viewtopic.php?t=98120

Meine erste Idee war es eine From zu nehmen, diese Transparent zu machen und dann dort die Infos ein zu blenden ... aber ich bin daran gescheitet den Rahmen etc von der Form auszublenden.

Um die Form auf dem Desktop anzudocken hatte ich versucht diesen Code zu verwenden ... das hatte auch so im ansatz geklappt

http://dotnet-snippets.de/dns/programm-am-desktop-andocken-SID673.aspx

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Tools{
    class Docking {
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr
        FindWindow([MarshalAs(UnmanagedType.LPTStr)] string lpClassName,
        [MarshalAs(UnmanagedType.LPTStr)] string lpWindowName);

        [DllImport("user32.dll")]
        public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

        /// <summary>
        /// Einzelnes Form auf den Desktop Festkleben
        /// </summary>
        /// <param name="formToDock">Formular, dass an den Desktop gedockt werden soll</param>
        public void StartDocking(Form formToDock) {
            IntPtr hwndParent = FindWindow("progman"null);
            SetParent(formToDock.Handle, hwndParent);
        }
        /// <summary>
        /// Einzelnes Formular vom Desktop wieder lösen und normal anzeigen lassen
        /// </summary>
        /// <param name="formToUndock">Formular das wieder normal angezeigt werden soll</param>
        public void StopDocking(Form formToUndock) {
            IntPtr hwndParent = FindWindow("screenclass"null);
            SetParent(formToUndock.Handle, hwndParent);
        }
    }
}


Mir ist wichtig, das die Infos wirklich hinter den Icons auf dem Desktop liegen, so das kein Fenster davon beeinträchtigt werden. Solche Geschichten wie [Windows]-[D] oder [Tab]-[Alt] sollten bei dem Tool auch nicht ansprechen.

Kann mir eventuell jemand einen Tipp geben, wie man eine solche Anwendung richtig programmiert?

mfG Hans


norman2306 - Di 02.03.10 01:35

Du kannst auch auf dem Desktopp rummalen. Dafür brauchst du das:

C#-Quelltext
1:
2:
[DllImport("user32.dll")]
public static extern IntPtr GetDC(long hwnd);


und dann sowas hier im Construktor:

C#-Quelltext
1:
2:
3:
4:
using(Graphics g = Graphics.FromHdc(GetDC(0)))
{
    g.DrawString("Hallo Welt"new Font("Times"40), Brushes.AliceBlue, new Point(200200));
}


Weiß aber nicht, ob das dahinter ist.
Du kannst auch das Desktopbild auslesen (Tip: Pfad ist in der Registry) und dann das bearbeiten und wieder zuweisen:


C#-Quelltext
1:
2:
3:
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int SystemParametersInfo(
        int Action, int pP, string lpv, int WinIni);


und dann


C#-Quelltext
1:
SystemParametersInfo(200, <Pfad>, 1 | 2)                    


Jop, hoffe, das hilft...


Net_Hans - Di 02.03.10 09:30

Danke für den Tip,

aber leider ist das noch nicht ganz das was ich haben möchte. Bei der Variante wo ich auf den Desktop malen kann, würde ich auch die Icons auf dem Desktop übermalen. Das soll ja nicht sein.

In der zweiten Idee, mit dem Hintergrundbild bekomm ich immer wenn ich das Bild aktuallisiere ein Flackern auf dem Monitor und eine Sanduhr am Mauszeiger mit und das kann auf Dauer sicher doch nerven ...

Wie bringe ich die Schrift oder ähnliches, wenn ich direkt auf den Desktop zeiche hinter die Icons?

mfG Hans


Ccenter - Sa 20.03.10 22:05

Ich hätte das jetzt so gemacht:
Hintergrund der Form weiß machen. Dann den Transperancykey ebenfalls auf weiß stellen.
Vorher natürlich noch den Formborderstye auf none setzten. Das hat den positiven nebeneffekt, dass die Form dadurch auch nicht mehr verschoben werden kann und dann immer an der Position bleibt, wo sie hingehört. Du solltest aber noch einen Code mit reinbringen, der festlegt, dass die Form immer an der selben Position startet. Dann am besten irgendwo auf die Form ein kleines label raufsetzten, welches durchs Clickevent ausgelöst wird und dem Benutzer dann erlaubt, die Startposition selbst zu bestimmen.