Seite 1 von 2

TIME TO SAY GOODBYE

Verfasst: 12.11.2008 15:24
von bobobo
nönö .. ich bleib bei PB

mein programm heisst nur so.

da ich oft mal gerne den feierabend vergesse, hab ich mir ein tool
gebastelt, welches mir die zeit um nach hause zu gehen anzeigt.

ich wollte ja gerne irgendwie direkt auf den hintergrund (hinter die
icons ) malen (nönö .. webinhalte auf dem desktop gibt es bei mir nicht)

ging nicht .. also male ich auf den desktop VOR alle fenster und icons
und möchte danach die fenster und icons zu bereinigen, so dass meine
ausgabe nur im hintergrund stehen bleibt.

ich hab dann ein wenig rumgetan mit invalidaterect_(....)
dabei zappelt mir der screen zu dolle. gibt augenkrebs.

fensterhandle bekomme ich wie im folgenden code gezeigt raus.
aber auch der liefert mir längst nicht alle.

Frage 1: wie bekomme ich den rest raus?

um die iconbereiche freizustellen habe ich dann mal handles von 1 bis
512 in eine schleife gepackt und es funktioniert so einigermassen.

nun die Frage:

Frage 2: wie bekomme ich das entsprechende handle (ist jedesmal ein anderes
aber vermutlich immer im 3stelligen bereich) direkt raus. ein fenster mit
dem handle finde ich da nicht.

hier mal der code (die farben sind scheusslich, passen aber gut zu meiner frisur 8) )

Code: Alles auswählen

Global Mem.l
Mem = AllocateMemory(1024)

Procedure.l GetWindowHandleandInvalidate (window, parameter)
  *Memory = ReAllocateMemory (0, 255)
  GetClassName_ (window, *Memory, 255)
  class$ = PeekS (*Memory)
  InvalidateRect_(window,0,0)
  ProcedureReturn #True
EndProcedure

Procedure.l DesktopOutput()
  PokeL(Mem, 1)
  ProcedureReturn Mem
EndProcedure

so.s=FormatDate("%hh:%ii",Date()-ElapsedMilliseconds()/1000+(3600*8))
ExamineDesktops()
w=DesktopWidth(0):h=DesktopHeight(0)
fi.l=FontID(LoadFont(#PB_Any,"",128))

For i=1 To 30
  r=174:g=116:b=85
  nr=r-11+Random(23)
  ng=g-11+Random(23)
  nb=b-11+Random(23)
  StartDrawing(Desktopoutput())
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawingFont(fi)
    FrontColor(RGB(nr,ng,nb))
    DrawText(Random(w-TextWidth(so)),Random(h-TextHeight(so)),so)
  StopDrawing()
  EnumWindows_ (@GetWindowHandleandInvalidate (), 0) ; holt windowhandle und 'invalidaterect' die
  
  For iv=1 To 512 ; könnte auch von 1 bis 65536 gehen , aber das holt mir auch nicht alle
    InvalidateRect_(iv,0,0)   ;Soll den Rest bereinigen (iconebene was auch immer)
  Next iv
  
  Delay(1000)
Next i
End
achsoja .. soll für windoof xp und co wuppen

Verfasst: 12.11.2008 21:39
von Fluid Byte
Soll die Anzeige so werden wie in deinem Beispiel? Also mehrere Ausgaben an verschiedenen Positionen?

Verfasst: 12.11.2008 21:55
von bobobo
jo .. soll auf dem schirm verteilt werden

das Programm startet als Autostarteintrag so dass gleich nach dem
"Wachwerden" die Uhrzeit (Rechnerstartzeit plus 8 Stunden)angezeigt
wird.

letztlich sollte es in etwas so aussehen
Bild

Verfasst: 12.11.2008 22:35
von Fluid Byte
Also spontan fällt mir jetzt auch nichts ein aber zumindest hab deinen Code etwas gekürzt. :mrgreen:

Code: Alles auswählen

LoadFont(0,"Arial",128)

Time$ = FormatDate("%hh:%ii",Date()-ElapsedMilliseconds()/1000+(3600*8))

For i=0 To 20
	hdc = GetWindowDC_(GetShellWindow_())
	SelectObject_(hdc,FontID(0))
	SetBkMode_(hdc,#TRANSPARENT)
	TextOut_(hdc,Random(1000),Random(700),Time$,5)
	ReleaseDC_(GetShellWindow_(),hdc)
	
	InvalidateRect_(65700,0,0)
	
	Delay(1000)
Next
Allerdings wird der transparente Hintergrund der Icons nicht aktualisiert. Das Handle was ich da eingesetzt habe ist vom ListView-Controls des Dekstops.

Verfasst: 13.11.2008 17:13
von bobobo
nett :allright:
das erspart so einige 'invalidaterecteerei' und sieht gleich 1000mal besser aus und ist sehr viel kompakter.

hier nochmal mit 'in bunt' und mit etwas bildschirmanpassung (*) mit
der komischen invalidaerect-schleife
(*) da mein comp ein laptop ist der in der Firma an einem Bildschirm
mit ca 30Milliarden mal 20Milliarden Pixel angestöpselt ist und zuhause
nur einer ist mit ner mickrigeren Auflösung, brauch ich das dynamischer

Code: Alles auswählen

;
;
;quasi hinter den schirm malen
;
;

LoadFont(0,"",128) 
Time$ = FormatDate("%hh:%ii",Date()-ElapsedMilliseconds()/1000+(3600*8)) 
ExamineDesktops()
tw=428 ;textwidth (gemessen)
th=190 ;textheight(gemessen)
w=DesktopWidth(0)-tw:h=DesktopHeight(0)-th ;


For i=0 To 30 
   hdc = GetWindowDC_(GetShellWindow_()) 
   SelectObject_(hdc,FontID(0)) 
   SetBkMode_(hdc,#TRANSPARENT) 
   SetTextColor_(hdc,RGB(153+Random(43),64+Random(43),64+Random(43)))
   TextOut_(hdc,Random(w),Random(h),Time$,5) 
   ReleaseDC_(GetShellWindow_(),hdc) 
  ;InvalidateRect_(65700,0,0)    brauch gar nich
   For iv=1 To 512
    InvalidateRect_(iv,0,0)   ;Soll den Rest bereinigen (iconebene was auch immer)
   Next iv
   Delay(1000) 
Next

Verfasst: 13.11.2008 18:41
von Spirit
Man könnte doch die Zeiten in ein Image schreiben, was so groß ist wie der Desktop, es abspeichern (als BMP) und dann mit
SystemParametersInfo_(SPI_SETDESKWALLPAPER, 0, "hintergrund.bmp", SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE)
als Desktophintergrund setzen.

Verfasst: 13.11.2008 18:53
von dige
Das flackert auch unangenehm...
Es gab mal ein Beispiel (nur als exe) in der jemand ein Video auf dem
ShellWindow abgespielt hat. Da flackerte nix und auch die Icons wurde nicht
übermalt ...
Wurde irgendwie mit DirectShow gelöst...

Verfasst: 13.11.2008 18:53
von bobobo
klar kann man, aber das kann ja jeder 8)
außerdem mag ich kein desktopbild haben


hier mal was matrixartiges in der technik

Code: Alles auswählen

LoadFont(0,"",18)
Time$ = FormatDate("%hh:%ii",Date()-ElapsedMilliseconds()/1000+(3600*8))
ExamineDesktops()
w=DesktopWidth(0):h=DesktopHeight(0) ;
tw=428 ;textwidth (gemessen)
th=190 ;textheight(gemessen)

del=2

For i=0 To 200
  hdc = GetWindowDC_(GetShellWindow_())
  SelectObject_(hdc,FontID(0))
  SetBkMode_(hdc,#TRANSPARENT)
  y=Random(15)-15
  x=Random(w)
  For c=1 To w/25
    y+25
    SetTextColor_(hdc,RGB(32,100+Random(80)+c,32))
    t$=Chr(Random(9)+48)
    TextOut_(hdc,x,y,t$,5)
    
  Next
  For iv=1 To 512
    InvalidateRect_(iv,0,0)   ;Soll den Rest bereinigen (iconebene was auch immer)
  Next iv
  
  ReleaseDC_(GetShellWindow_(),hdc)
  Delay(del)
Next

Re: TIME TO SAY GOODBYE

Verfasst: 05.02.2025 18:14
von Then
Habe gerade mal die Codes ausprobiert und sie funktionieren noch.... so halbwegs. Wenn ich ein Fenster hin und her bewege ist alles okay, aber wenn ich ein ICON anklicke und wieder loslasse, ist mein "gemaltes" wieder weg. Kann man das ändern ?

Re: TIME TO SAY GOODBYE

Verfasst: 05.02.2025 18:37
von bobobo
erstaunlich das das noch irgendwie geht .. und dann auch wieder nicht
der letze code schmiert meinen Bildschirm schön voll hinter die Fenster aber über die Icons

wenn ich dann mit der Maus über die Icons drüber rutsche verschwindet das drübergemalte.

da passiert dann wohl ein auf den iconbereich beschränktes Refresh.

um das zu vermeiden einfach nicht mit der Maus rumklicken :mrgreen:

hie rnochmal so ein code den ich bei mir auf der platte gefunden habe, der malt nur am untern Bildschirm rand was hin

Code: Alles auswählen

LoadFont(0,"",32)
Debug ElapsedMilliseconds()
Time$ = FormatDate("%hh:%ii",Date()-ElapsedMilliseconds()/1000+(3600*8))
ExamineDesktops()
w=DesktopWidth(0):h=DesktopHeight(0) ;
tw=30;428 ;textwidth (gemessen)
th=120 ;textheight(gemessen)


del=333
del=33
ro.l=235:go.l=80:bo.l=80
;r=82:g=111:b=bo
py=h-th
For i=0 To 30
FreeFont(0)
  LoadFont(0,"",Random(22)+10)
  hdc = GetWindowDC_(GetShellWindow_())
  SelectObject_(hdc,FontID(0))
  SetBkMode_(hdc,#TRANSPARENT)
  ;r=153+Random(43):g=64+Random(43):b=64+Random(43)
  
  ;r=ro-8+Random(16):g=go-8+Random(16):b=bo-8+Random(15)
  r=ro-20+Random(40):g=go-20+Random(40):b=bo-20+Random(40)
  
  px=Random(w-tw):py=h-th:py=Random(50)+(h-th-50);:py=h-th
  
  ;For t=2 To 1 Step -1
  ;  Debug Str(r-r*5)+" "+Str(g-r*5)+" "+Str(b-r*5)
  ;  SetTextColor_(hdc,RGB(r-t*8,g-t*8,b-t*8))
  ;  TextOut_(hdc,px+t,py+t,Time$,5)
  ;Next t
  SetTextColor_(hdc,#Black)
  TextOut_(hdc,px+1,py+1,Time$,5)
  Select Random(2)
  Case 0
  SetTextColor_(hdc,#Yellow)
  Case 1
  SetTextColor_(hdc,#Red)
  Case 2
  SetTextColor_(hdc,#Green)
  EndSelect
  TextOut_(hdc,px,py,Time$,5)
  
  
  ;ReleaseDC_(GetShellWindow_(),hdc)
  ;InvalidateRect_(65700,0,0)    brauch gar nich
  For iv=1 To 512
    InvalidateRect_(iv,0,0)   ;Soll den Rest bereinigen (iconebene was auch immer)
  Next iv
  ;del+33
  
  del+33
  Debug del
  ReleaseDC_(GetShellWindow_(),hdc)
  Delay(del)
Next