Seite 1 von 2

Direkt auf Desktop zeichnen

Verfasst: 15.07.2010 18:51
von teamO
Hi,

Wie der Betreff schon sagt versuch ich gerade was direkt (also ohne Fenster oder so) auf dem Desktop zu zeichnen (zb. so wie mit 2d-Drawing auf Fenstern und Screens). Ich hab schon die Forensuche bemüht, und hab auch einen kleinen Beispielcode von Stargate gefunden:

Code: Alles auswählen

Global DesktopOutput_Memory = AllocateMemory(1024)
Procedure.l DesktopOutput()
PokeL(DesktopOutput_Memory, 1)
ProcedureReturn DesktopOutput_Memory
EndProcedure
StartDrawing(DesktopOutput())
Repeat
  Plot(Random(1023), Random(767), RGB(Random(255), Random(255), Random(255)))
Until GetAsyncKeyState_(27)
StopDrawing() 
Der Produziert bei mir aber nur IMAs...

hat jemand ne idee, warum? oder wie ich das anders lösen könnte?
ich benutze PB 4.5

Re: Direkt auf Desktop zeichnen

Verfasst: 15.07.2010 20:17
von NicknameFJ
Hallo TeamO,

Du musst

Code: Alles auswählen

StartDrwaing()
Plot(...)
Stopdrawing()
direkt hintereinander in der Schleife haben.

Also z.B. so: (an Deinen Code angelehnt):

Code: Alles auswählen

Global DesktopOutput_Memory = AllocateMemory(1024)

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


  Repeat
    StartDrawing(DesktopOutput())
    Plot(Random(1023), Random(767), RGB(Random(255), Random(255), Random(255)))
    StopDrawing()
    Delay(10)
  Until GetAsyncKeyState_(27)



Grüße
NicknameFJ

Re: Direkt auf Desktop zeichnen

Verfasst: 15.07.2010 20:32
von teamO
Danke, hatte ich übersehen.
Der Invalid Memory Access Error kommt aber auch im verbesserten code...

Re: Direkt auf Desktop zeichnen

Verfasst: 15.07.2010 20:55
von NicknameFJ
Oops,

hatte da wohl was anderes im Gedächtnis, nämlich, dass wenn man sich über API ein Handle für Drawing zu einem Fenster holt, dieses nur im gleichen MainLoop Durchlauf gültig ist.

Hatte meinen Code mit 4.10 getestet, da geht es

mit 4.4 geht´s nicht mehr.

Sry.

Re: Direkt auf Desktop zeichnen

Verfasst: 15.07.2010 21:30
von Thorium
Ich verstehe nicht wirklich wie das funktioniert mit dem Desktop und warum du da 1024 Byte allozierst.
Zeichnest du in DesktopOutput_Memory rein?
Dann ist klar das du IMA's bekommst, den allozierst du nur mit 1024 Byte. Laut deinem Random-Code greifst du aber auf 1024 * 767 * 3 = 2356224 Byte zu, möglicherweise noch mehr, wenn der Pitch > 1024 * 3

Re: Direkt auf Desktop zeichnen

Verfasst: 15.07.2010 21:56
von Fluid Byte
Dieser Trick funktioniert nicht mehr seitdem die Drawing-Lib aktualisiert wurde.

Benutze einfach API:

Code: Alles auswählen

hdcDesktop = GetDC_(GetDesktopWindow_())

Repeat
  SetPixel_(hdcDesktop,Random(1023), Random(767), RGB(Random(255), Random(255), Random(255)))
Until GetAsyncKeyState_(27)

ReleaseDC_(0,hdcDesktop)

Re: Direkt auf Desktop zeichnen

Verfasst: 16.07.2010 11:48
von teamO
Danke für die Antworten!

@NicknameFJ:
NicknameFJ hat geschrieben:Hatte meinen Code mit 4.10 getestet, da geht es mit 4.4 geht´s nicht mehr.
Kann das das sein, was Fluid Byte gemeint hat? Mit der Aktualisierung der Drawing-Lib?

@Thorium:
Ich versteh auch nicht was da gemacht wird.
Wie gesagt: Ich hab den Code von Stargate kopiert...

@Fluid Byte:
Das funktioniert bei mir irgendwie auch nicht.
es gibt zwar keine Fehlermeldung, aber halt auch keine Ausgabe....
ich muss aber auch zugemen, dass ich nicht versteh, was du da machst.
SetPixel_(...) ist ja relativ vielsagend, aber was macht die erste Zeile?

Achso, ich nutze noch XP. Kann es daran liegen?

Re: Direkt auf Desktop zeichnen

Verfasst: 16.07.2010 12:27
von NicknameFJ
Kann das das sein, was Fluid Byte gemeint hat? Mit der Aktualisierung der Drawing-Lib?
Ja, glaube auch dass die LIB dazwischen geändert wurde.
ich muss aber auch zugemen, dass ich nicht versteh, was du da machst.
SetPixel_(...) ist ja relativ vielsagend, aber was macht die erste Zeile?
In der ersten Zeile holst Du dir ein Handle zum DeviceContext des Desktop(Fensters), in der zweiten findet das Drawing auf diesen DeviceContext statt und in der letzten gibst Du den Context wieder frei.

Habe XP, kann bestätigen dass das Prog von Fluid hier auch nicht klappt

Grüße NicknameFj

Re: Direkt auf Desktop zeichnen

Verfasst: 16.07.2010 12:33
von bobobo
nochmal mit textausgabe

Code: Alles auswählen

hdc = GetWindowDC_(GetShellWindow_())
text$ = "Kacke nee "
SetTextColor_(hdc,#Cyan)
SetBkColor_(hdc,#Red)
TextOut_(hdc,0,0,text$,Len(text$))
ReleaseDC_(GetShellWindow_(),hdc)
der fette nachteil ist hier die platformabhängigkeit

Re: Direkt auf Desktop zeichnen

Verfasst: 16.07.2010 19:41
von teamO
cool, funktioniert!
Danke!

Jetzt kommt mir noch ne andere Idee: Gibt es ne möglichkeit über alles, sozusagen direkt hinter dem "Glas" des Monitors, zu zeichnen?
wenn nicht, würde ich es mit einem unsichtbaren Fenster machen, das immer im Vordergrund ist, aber dann müsste ich noch den rgb wert eines beliebigen Pixels auszulesen (in der vordersten Ebene, also entweder auf einem Fenster oder dem Desktop)

hat jemand ne idee?

Grüße,
TeamO