Auf Desktop zeichnen...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

ts-soft Du machst mich stolz !

Ich glaube ich steige demnächst vom blutigen Anfänger zum Anfänger auf.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Meinetwegen kannste das Pflaster abnehmen, wirst ja sehen, obs noch blutet :lol:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Daniel P.
Beiträge: 333
Registriert: 06.12.2005 21:49
Kontaktdaten:

Beitrag von Daniel P. »

ts-soft hat geschrieben:Was ist den der Unterschied zwischen DesktopWindow und Desktop.
Desktop hat immer 0 als Handle. DesktopWindow hat ein extra Handle?
Wenn ich mir das Ergebnis dieser Funktion zurückgeben lasse, erhalte ich aber nicht 0...
Zu Deinem Problem:

Code: Alles auswählen

GetModuleHandle_(GetDesktopWindow_())
wäre die logische Konsequenz
Sicher? Das habe ich schon probiert und es passiert nichts. Irgendwie erwartet GetModuleHandle_() einen String oder sowas - auf alle Fälle nicht 0 (wenn GetDesktopWindow_() das zurückgeben würde), denn dann würde diese Funktion den "ModuleHandle" des eigenen Programms zurückgeben - ich brauch aber das vom Desktop.
Um Dein Fenster als Unterfenster des Desktops zu erklären, kannste es normal erstellen und mit:

Code: Alles auswählen

SetParent_(DeinFensterhWnd, 0)
zum Desktopfenster machen.
Danke. Werde es mal ausprobieren. Wie man den ModuleHandle des Desktops ermittelt, kannst du mir aber nicht sagen, oder?

Gruß

// EDIT:
SetParent_() fuhnktioniert zwar, bringt mich aber nicht zum erhofften Ziel. Ich muss definitiv ein "Owned-Window" für den Desktop erstellen - und alles, was mir dazu fehlt ist dieses Module-Teil *needhelp* :!:

// DOPPELEDIT:
Kann mir jemand sagen, wie die DLL oder die EXE-Datei heißt, die den Desktop ausführt. Diesen Namen erwartet nähmlich GetModuleHandle_()...
Gruß, Daniel :? | In der Realität ist die Wirklichkeit ganz anders...

PB 4.10 (Windows XP SP 2)
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

explorer müsste das sein :)
Bild
BildDas ist Tux. Kopiere Tux in deine Signatur und hilf ihm so auf seinem Weg zur Weltherrschaft.
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Ne, ich denke Winlogon, denn den Desktop (ohne Icons)
sieht man auch noch, wenn der Explorer abgeschmiert ist.
Benutzeravatar
Daniel P.
Beiträge: 333
Registriert: 06.12.2005 21:49
Kontaktdaten:

Beitrag von Daniel P. »

"winlogon.exe" ist laut Google für das An- und Abmelden zuständig. "explorer.exe" könnte es schon eher sein. Laut Google sorgt diese Anwendung für die Startleiste, Icons und die Verarbeitung der Rechtsklicks auf den Desktop ... muss ich mal ausprobieren (Mist, sitze gerade an einem Mac, also erst heute abend). Bis denne...

Gruß
Gruß, Daniel :? | In der Realität ist die Wirklichkeit ganz anders...

PB 4.10 (Windows XP SP 2)
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

Von Danilo aus http://forums.purebasic.com/german/viewtopic.php?t=678
Mit GetDesktopWindow_() bekommst Du das Handle des
Desktop-"Fensters" und kannst dann über GetDC_() darauf
zeichnen. Das zeichnet allerdings oben drauf, also auch über
bereits sichtbare Fenster - was sicher hier nicht gewollt ist.

Den Hintergrund (Pattern,Bild) und darauf die Icons speichert
Windows wohl intern und blittet es dann auf den Desktop.
Über COM dürfte es aber eine Möglichkeit geben direkt den
Hintergrund zu manipulieren (Suchmaschine anwerfen).
Ich bin beim googeln auf folgendes gestoßen :
IActiveDesktop Interface
Allows a client program to manage the desktop items and wallpaper on a local computer.
Für mich ist COM aber so etwas wie höhere Mathematik oder die Frauen.
Ich ahne um was es geht. Ich kann zum Teil sogar damit umgehen
- allerdings ohne zu wissen was ich da genau tue,
denn richtig verstanden habe ich es nicht
(und werde ich vorraussichtlich auch nicht mehr).
Benutzeravatar
Daniel P.
Beiträge: 333
Registriert: 06.12.2005 21:49
Kontaktdaten:

Beitrag von Daniel P. »

Laut MSDN kann man damit den Desktop bearbeiten, sprich Icons hinzufügen/entfernen/manipulieren und den Pfad zum Hintergrund auslesen bzw. ändern. Zum Herumpinseln wird das wohl nicht reichen. Wenn das mit dem OwnedWindow funtkioniert, spielt das aber eh keine große Rolle mehr :wink:

Gruß
Gruß, Daniel :? | In der Realität ist die Wirklichkeit ganz anders...

PB 4.10 (Windows XP SP 2)
Benutzeravatar
Daniel P.
Beiträge: 333
Registriert: 06.12.2005 21:49
Kontaktdaten:

Beitrag von Daniel P. »

Das HIER ist doch mal ein extrem schlechter Witz, oder? Das ist ja so, als ob man kurz vor dem Ziel die Beine rausgerissen bekommt :freak:
Wo bekommte ich den jetzt mein Module-Handle her. Wenn ich der Funktion 0 übergebe, erhalte ich das Module-Handle meines Programms. Wenn ich der Funktion - laut MSDN - eine Anwendung aus dem Anwendungspool gebe, bekomme ich immer 0 zurück = Fehler :shock: Ich will doch nur mein Module-Hääändleheheh *buhuuhhu* :cry:
Gruß, Daniel :? | In der Realität ist die Wirklichkeit ganz anders...

PB 4.10 (Windows XP SP 2)
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

Sollte mein Tip tatsächlich total daneben liegen
(Ich vermute die Lösung immer noch im Bereich von
User Interface > Windows Shell > ...
Mit meinem Englisch ist es aber auch nicht so weit her.)
tut es mir leid.
Aber, vielleicht weist der Tip von Danilo aus dem anderen Thread
trotzdem in die richtige Richtung.

edit :
Alternativ könntest Du auf diesem Weg (2. DC-Ausgabe) zwar auf den Desktop
malen, aber eben nicht auf den Desktop-Hintergrund.

Code: Alles auswählen

text1$ = "Hello World !"
text2$ = "Der Desktop sollte oben nur in der Mitte durch ein Fenster verdeckt sein.  Weiter mit Escape ...."
hWin=0 ; Der Bildschirm - wer hier malt, malt eventuell auf andere Fenster
MyDC = GetDC_(hWin) ; DeviceContext zum malen, schreiben, ....
SetBkMode_(MyDC, #TRANSPARENT)
TextOut_(MyDC, 0, 5, text1$, Len(text1$));********************** 1. DC-Ausgabe
TextOut_(MyDC, 200, 25, text2$, Len(text2$));
ReleaseDC_(hWin, MyDC) ; immer gleich wieder frei geben !!!
Repeat : Until GetAsyncKeyState_(#VK_ESCAPE)
InvalidateRect_(hWin,0,1)


; weitere Möglichkeiten 
hDesktop=GetDesktopWindow_();
Debug hDesktop
hDesktop=FindWindowEx_(hDesktop, 0, "Progman", "Program Manager");
Debug hDesktop
ShowScrollBar_(hDesktop,#SB_VERT,#True)
Delay(200);
InvalidateRect_(hWin,0,1) 
Repeat : Until GetAsyncKeyState_(#VK_ESCAPE)
ShowScrollBar_(hDesktop,#SB_VERT,#False)
InvalidateRect_(hWin,0,1)

hDesktop=FindWindowEx_(hDesktop, 0, "SHELLDLL_DefView", 0);
Debug hDesktop
hDesktop=FindWindowEx_(hDesktop, 0, "SysListView32", 0);
Debug hDesktop
#LVM_GETTITEMCOUNT = $1000 + 4
Debug SendMessage_(hDesktop, #LVM_GETTITEMCOUNT, 0, 0) ;anzahl der desktop icons
SendMessage_(hDesktop,#LVM_SETTEXTCOLOR,0,RGB(255,0,0))
SendMessage_(hDesktop,#LVM_SETTEXTBKCOLOR,0,#CLR_NONE)

MyDC = GetDC_(hDesktop) ; DeviceContext zum malen, schreiben, ....
SetBkMode_(MyDC, #TRANSPARENT)
TextOut_(MyDC, 0, 5, text1$, Len(text1$));********************** 2. DC-Ausgabe
TextOut_(MyDC, 200, 25, text2$, Len(text2$));
ReleaseDC_(hDesktop, MyDC) ; immer gleich wieder frei geben !!!
Debug "2. DC-Ausgabe malt nun nicht mehr über Fenster,"
Debug "aber immer noch über Desktop-Icons"
Debug "und wird gleich wieder überpinselt"

Delay(200);
Repeat : Until GetAsyncKeyState_(#VK_ESCAPE)
InvalidateRect_(hWin,0,1)
UpdateWindow_(hWin)
SendMessage_(hDesktop,#LVM_SETTEXTCOLOR,0,RGB(255,255,255)) 
SendMessage_(hDesktop,#LVM_SETTEXTBKCOLOR,0,#CLR_NONE)
InvalidateRect_(hWin,0,1)
Zuletzt geändert von uweb am 28.02.2006 14:13, insgesamt 1-mal geändert.
Antworten