Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Screensaver/Desktop control library attempt (incomplete)


  • Please log in to reply
No replies to this topic
daonlyfreez
  • Members
  • 995 posts
  • Last active: Jan 23 2013 08:16 AM
  • Joined: 16 Mar 2005
Too bored maybe, but I decided to create a nice library for the 'eye candy' of every WinOS, the desktop and screensavers.

I thought it would be easy, but I was wrong.

What I wanted: easy calls for screensaver control and the desktop, meaning, the icons and wallpaper, and the taskbar and traybar maybe too... :cry:

Good learning experience for DllCall it turned out to be, and SendMessage too...

Setting with DllCall (as an equivalent of SendMessage) might work, but getting data... :?

I have no clue... Example:

Getting/setting the icons on the desktop seems to be impossible, for it needs to write into the memoryspace of the desktop a structure that I cannot set... all way over my head anyway :oops:

But already a 'simple' call of SPI_GETSCREENSAVEACTIVE gave me headaches...

But well, here is the first code, please give attention to the things I cannot get to work, and test the rest :p (I test on 2k only sofar)

I took the liberty of posting this 'already' in this part of the forum, though its not complete. More code to come...

/* *** Screensaver library

wanted:

#SSRun("") ; 1=run current,, 0=stop running screensaver, path=runs the screensaver path
#SSCon("") ; 1=configure current, 0=opens the 'Display Properties window at the screensaver tab, path=opens the configuration screen of the screensaver path
#SSSet("") ; 1=enable,0=disable,path=sets the screensaver to path
#SSGet("") ; 1=returns the state (-1=disabled, 0=enabled, 1=running), 0=returns the path of the currently enabled/running screensaver
#SSIns("") ; 1=installs,0=deinstalls

working:

#SSRun("")
#SSCon("")
#SSSet("")
(#SSGetCur() <- gets path to current ss, used by other functions)

*/

; test calls
;#SSGet(0)
;#SSGet(1)

#SSGet(s)
{
	; s = return path to current screensaver
	if s = 0
	{
		RegRead, cs, HKEY_CURRENT_USER, Control Panel\Desktop, SCRNSAVE.EXE
		if errorlevel = 1
		{
			MsgBox, 0, Error, There was a problem reading from the registry
			Exit
		}
		return cs
	}
	; s = return state of screensaver
	if s = 1
	{
		;???
		;BOOL IsActive;
        ;if (!SystemParametersInfo( SPI_GETSCREENSAVEACTIVE, 0, &IsActive, 0


		IsActive = 0
		res1 := dllcall("SystemParametersInfo", UInt, 0x0010, UInt, IsActive, UInt, 0, UInt, 0)
;		res2 := dllcall("SystemParametersInfo", UInt, 0x0072, UInt, 0, UInt, 0, UInt, 0)
;		res3 := dllcall("SystemParametersInfo", UInt, 0x000E, UInt, 0, UInt, 0, UInt, 0)

		msgbox, IsActive: %IsActive%`nres1:`n%res1%`nres2:`n%res2%`nres3:`n%res3%`nerrorlevel:%errorlevel%

		; IsActive:
		; res1: 1


	}
}

; ---------------- working


; test calls
;#SSSet("C:\WINNT\bubbles.scr") ; set
;#SSSet("C:\WINNT\cyclone.scr") ; set other
;#SSSet("C:\WINNT\acyclone.scr") ; non existant
;#SSSet("") ; empty
;#SSSet(0) ; disable
;#SSSet(1) ; enable

#SSSet(s)
{
	; s = 1 -> enable
	if s = 1
	{
		DllCall("SystemParametersInfo", UInt, 0x0011, UInt, TRUE, UInt, 0, UInt, 0x0002)
		return
	}
	; s = 0 -> disable
	if s = 0
	{
		DllCall("SystemParametersInfo", UInt, 0x0011, UInt, FALSE, UInt, 0, UInt, 0x0002)
		return
	}
	; s = other -> might be path
	filegetversion, v, %s%
	if FileExist(s) and ((v != "") or (InStr(FileExist(s),"D") = 0)) and (s contains scr)
	{
		RegWrite, REG_SZ, HKEY_CURRENT_USER, Control Panel\Desktop, SCRNSAVE.EXE, %s%
		if errorlevel = 1
		{
			MsgBox, 0, Error, There was a problem writing to the registry
			Exit
		}
		#SSSet(1)
	}
	; s = something else -> error
	else
	{
		msgbox, 0, Error - Bad input., Either the path to screensaver is incorrect, or the input is empty`n`ninput: %s%`n`n... quitting
		exit
	}
}

; test calls
;#SSRun(1)
;#SSRun("C:\WINNT\bubbles.scr")

#SSRun(s)
{
	; s = run current
	; would work too, but no errorcheck: SendMessage, 0x112, 0xF140, 0,, Program Manager
	if s = 1
	{
		cs := #SSGet(0)
		if cs !=
		{
			run, %cs% /S,, UseErrorLevel
			if errorlevel = ERROR
			{
				msgbox, 0, Error, The path to the active screensaver is incorrect:`n`n%cs%
				exit
			}			
		}
		else
		{
			msgbox, 0, Error, No active screensaver, or none specified, therefore you cannot start the screensaver.
			exit
		}
	}
	; s = stop
	if s = 0
		Send, {ESC} ; should be extended, proc/winkill?
	; s = path
	filegetversion, v, %s%
	if FileExist(s) and ((v != "") or (InStr(FileExist(s),"D") = 0)) and (s contains scr)
	{
		run, %s% /S,, UseErrorLevel
		if errorlevel = ERROR
		{
			msgbox, 0, Error, There was a problem running the following screensaver:`n`n%s%
			exit
		}	
	}
}

;#SSCon("C:\WINNT\cyclone.scr")
;#SSCon("C:\WINNT\bubbles.scr")
;#SSCon("")

#SSCon(s)
{
	if s = 0
	{
		run, control desk.cpl`,Display Properties`,1,, UseErrorLevel
		if errorlevel = ERROR
		{
			msgbox, 0, Error, Could not open the Display Properties control panel
			exit
		}
	}
	if s = 1 ; open configuration window of current
	{
		cs := #SSGetCur()	
		if cs !=
		{
			run, %cs% /C,, UseErrorLevel
			if errorlevel = ERROR
			{
				msgbox, 0, Error, The path to the active screensaver is incorrect:`n`n%cs%
				exit
			}			
		}
		else
		{
			msgbox, 0, Error, No active screensaver, or none specified, therefore you cannot open the configuration screen.
			exit
		}		
	}
	if s != ; might be a path
	{
		;if s contains .scr ...
		if (s contains scr) and (if InStr(FileExist(s),D) = 1)
		{
			run, %s% /C,, UseErrorLevel
			if errorlevel = ERROR
			{
				msgbox, 0, Error, The path to the selected screensaver is incorrect:`n`n%s%
				exit
			}
		}
		else
		{
			msgbox, 0, Error, Bad path
			exit
		}
	}
	; s = something else -> error
	else
	{
		msgbox, 0, Error - Bad input., Either the path to screensaver is incorrect, or the input is empty`n`ninput: %s%`n`n... quitting
		exit
	}
}


;cs := #SSGetCur()
;msgbox, %cs%

#SSGetCur()
{
	RegRead, cs, HKEY_CURRENT_USER, Control Panel\Desktop, SCRNSAVE.EXE
	if errorlevel = 1
	{
		MsgBox, 0, Error, There was a problem reading from the registry
		Exit
	}
	return cs
}

Posted Image mirror 1mirror 2mirror 3ahk4.me • PM or Posted Image