Seite 2 von 2

Verfasst: 08.09.2007 16:36
von Kaeru Gaman
> Es macht den Desktop zum Screensaver

da muss ich mal meinen senf dazugeben:

ein ScreenSaver heißt so, weil er eine Überbeanspruchung des Monitors durch ein statisches Bild verhindert.
ein statisches Bild selber kann also kein ScreenSaver sein.

ein ScreenSaver wäre es, wenn du das bild permanent bewegst, also z.b. waagerecht durchscrollen läßt.

Verfasst: 09.09.2007 17:22
von blbltheworm
Ich möchte noch kurz eines einwerfen, bevor hier die Diskutiererei los geht:

Es geht hier nicht um Sinn, oder Unsinn des von mir geschrieben Programmes, fakt ist, es hat keinen Sinn, aber es macht Spaß es zu schreiben.

Und bevor hier jetzt eine Debatte über Screensaver losgeht.
Ich weiß was Sinn & Zweck eines Screensavers ist und die aussage aus dem Desktop einen Screensaver zu machen war genau so sinnvoll wie das Programm das ich schreibe.

Verfasst: 09.09.2007 18:18
von PMTheQuick
Also... Ich habe mir mal die Mühe gemacht, einen anpassungsfähigen Code zu schreiben, der bei Mausbewegung den Wallpaper wieder hidden macht, und sobald eine Zeit lang die Maus nicht bewegt wurde, wieder angezeigt wird. Es arbeitet mit einem Fenster. Hier der Code:

Code: Alles auswählen

Procedure Diff(Z1,Z2)
  If Z1 > Z2
    ProcedureReturn Z1-Z2
  ElseIf Z2 > Z1
    ProcedureReturn Z2-Z1
  EndIf
EndProcedure

; get filename of current wallpaper 
unibuff=AllocateMemory(2*(#MAX_PATH+1)) 
ansibuff=AllocateMemory(#MAX_PATH) 
CoInitialize_(0) 
If CoCreateInstance_(?clsid_activedesktop,0,1,?iid_iactivedesktop,@iad.IActiveDesktop)=#S_OK 
    !PUSH dword 0      
    !PUSH dword 522; 2*(#max_path+1)          
    !MOV eax,dword [v_unibuff] 
    !PUSH eax 
    !MOV eax,dword [v_iad] 
    !PUSH eax 
    !MOV eax, [eax] 
    !CALL dword [eax+16]; iad\getwallpaper(unibuff,2*(#max_path+1),0) 
    WideCharToMultiByte_(#CP_ACP,#WC_COMPOSITECHECK,unibuff,-1,ansibuff,#MAX_PATH,0,0)  
    iad\release() 
EndIf 
CoUninitialize_() 
Wallpaper$ = PeekS(ansibuff) 
FreeMemory(unibuff) 
FreeMemory(ansibuff) 

ME = 10 ; Maus Empfindlichkeit (min. XX Pixel-Verschiebung)
WSZ = 2 ; Zeit bis der Wallpaper kommt (sek)

ExamineDesktops()
If OpenWindow(0,0,0,DesktopWidth(0),DesktopHeight(0),"Wallpaper",#PB_Window_BorderLess)
  CreateGadgetList(WindowID(0))
  ID = LoadImage(#PB_Any,Wallpaper$)
  ResizeImage(ID,WindowWidth(0),WindowHeight(0),#PB_Image_Raw)
  ImageGadget(0,0,0,WindowWidth(0),WindowHeight(0),ImageID(ID))

  OldX = DesktopMouseX()
  OldY = DesktopMouseY()

  ShowCursor_(0)
  StickyWindow(0,#True)
  Repeat
    WindowEvent()
    If modus = 1
      If Diff(OldX,DesktopMouseX()) > ME Or Diff(OldY,DesktopMouseY()) > ME
        lasttime = ElapsedMilliseconds()
      Else
        If ElapsedMilliseconds()-lasttime > WSZ * 1000 ; Nach 5sek Wallpaper anzeigen
          modus = 0
          HideWindow(0,0)
          
        EndIf
      EndIf
      OldX = DesktopMouseX()
      OldY = DesktopMouseY()
    Else
      If Diff(OldX,DesktopMouseX()) > ME Or Diff(OldY,DesktopMouseY()) > ME
        modus = 1
        lasttime = ElapsedMilliseconds()
        HideWindow(0,1)
      EndIf
      OldX = DesktopMouseX()
      OldY = DesktopMouseY()
    EndIf
  ForEver
EndIf
  

DataSection 
clsid_activedesktop: 
Data.b $00,$87,$04,$75,$1F,$EF,$D0,$11,$98,$88,$00,$60,$97,$DE,$AC,$F9 
iid_iactivedesktop: 
Data.b $00,$EB,$90,$F4,$40,$12,$D1,$11,$98,$88,$00,$60,$97,$DE,$AC,$F9 
EndDataSection
Ich hoffe, das dir das was nützt. Er hiddet auch die Maus ;) Im Code hat es 2 Variablen, die beschrieben werden ;)

Gruss
PMTheQuick ;)

Verfasst: 10.09.2007 11:53
von Tafkadasom2k5
Was ich machen würde: Einen Screensaver selber schreiben (ist idR nur eine umbenannte .exe in .scr), der einfach sich das Hintergrundbild ausließt, und es mit "OpenScreen" einfach läd. Keine Maus - keine Störungen. UND man kann zusätzlich noch eine Screensaver-Funktion einbauen, die das Bild einfach manchmal ein bisschen verzerrt.

So bist du viel variabler :allright:

Verfasst: 10.09.2007 12:01
von AND51
Tafkadasom2k5 hat geschrieben:Was ich machen würde: Einen Screensaver selber schreiben (ist idR nur eine umbenannte .exe in .scr), der einfach sich das Hintergrundbild ausließt, und es mit "OpenScreen" einfach läd.
AND51 hat bereits [i]vorher[/i] hat geschrieben:Das ist aber umständlich! Ich hätte es anders gelöst: Ich hätte den Pfad zum Wallpaper ermittelt und dieses dann in einem OpenScreen() oder in einem Fenster (borderless, sticky (immer im Vordergrund), genauso breit und hoch wie der Desktop) anzeigen lassen. [...]

Verfasst: 10.09.2007 13:20
von Tafkadasom2k5
A) :praise: Bild:roll:

B) Es ging hier auch um die Umbenennung, um die Verwandschaft von exen zu SCRs.

Nennen wirs Teamwork, okay? :roll:

Verfasst: 10.09.2007 13:41
von AND51
> Nennen wirs Teamwork, okay?
Ja natürlich, Marc... Zusammenarbeiten ist immer besser als gegeneinander. :allright:
Es war ja auch nicht bös gemeint meinersets. Sorry, sollte es so interpretiert worden sein.

Verfasst: 10.09.2007 13:45
von Tafkadasom2k5
Da hat jemand aber ein gutes Gedächtnis was Vornamen angeht ;)
Ansonsten: Alles klar :allright: <)

Verfasst: 10.09.2007 15:03
von AND51
> Da hat jemand aber ein gutes Gedächtnis was Vornamen angeht
Och, das war ganz einfach... <)

Verfasst: 20.09.2007 16:41
von blbltheworm
Auch wenn es etwas spät kommt.

Vielen Dank für den Code, vorallem für das Ermitteln des Pfades zum Wallpaper.