C# - Wallpaper / Frage ...

Alexander12

Erfahrenes Mitglied
Hi.

Ja, Ich schon wieder.
Ich habe schon auf TheCodeProject Code gesucht, um das Wallpaper zu wechseln. Allerdings fand Ich da immer nur 2-3 Seiten Code, Ich möcht aber keinen Schnickschnack etc. nur das Wallpaper wechseln. Da hab Ich nicht mehr durchgeblickt. Ich bin mir sicher, dass es bestimmt nur ein paar Zeilen sind, hat da jemand nen brauchbaren Link?


MfG Alexander12
 
Code:
public sealed class Wallpaper
{
	Wallpaper( ) { }

	const int SPI_SETDESKWALLPAPER = 20  ;
	const int SPIF_UPDATEINIFILE = 0x01;
	const int SPIF_SENDWININICHANGE = 0x02;

	[DllImport("user32.dll", CharSet=CharSet.Auto)]
	static  extern int SystemParametersInfo (int uAction , int uParam , string lpvParam , int fuWinIni) ;

	public enum Style : int
	{
		Tiled,
		Centered,
		Stretched
	}

	public static void Set ( Uri uri, Style style )
	{
		System.IO.Stream s = new WebClient( ).OpenRead( uri.ToString( ) );

		System.Drawing.Image img = System.Drawing.Image.FromStream( s );
		string tempPath = Path.Combine( Path.GetTempPath( ), "wallpaper.bmp"  ) ;
		img.Save( tempPath ,  System.Drawing.Imaging.ImageFormat.Bmp ) ;

		RegistryKey key = Registry.CurrentUser.OpenSubKey( @"Control Panel\Desktop", true ) ;
		if ( style == Style.Stretched )
		{
			key.SetValue(@"WallpaperStyle", 2.ToString( ) ) ;
			key.SetValue(@"TileWallpaper", 0.ToString( ) ) ;
		}

		if ( style == Style.Centered )
		{
			key.SetValue(@"WallpaperStyle", 1.ToString( ) ) ;
			key.SetValue(@"TileWallpaper", 0.ToString( ) ) ;
		}

		if ( style == Style.Tiled )
		{
			key.SetValue(@"WallpaperStyle", 1.ToString( ) ) ;
			key.SetValue(@"TileWallpaper", 1.ToString( ) ) ;
		}

		SystemParametersInfo( SPI_SETDESKWALLPAPER, 
			0, 
			tempPath,  
			SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE );
	}
}
 
Hi Norbert.

Das muss Ich gleich probiern, den ganzen Abend mach Ich schon dran rum! :)
Vielen, Vielen Dank für den Code! ;)


MfG Alexander12
 
Hi Norbert.

Ich habe den Code Mal so für dieses Projekt zugeschnitten:
Code:
public class Wallpaper
{
	const int SPI_SETDESKWALLPAPER = 20;
	const int SPIF_UPDATEINIFILE = 0x01;
	const int SPIF_SENDWININICHANGE = 0x02;
	[DllImport("user32.dll", CharSet=CharSet.Auto)]
	static extern int SystemParametersInfo (int uAction , int uParam , string lpvParam , int fuWinIni) ;
	public void Set (  string filename )
	{
		string tempPath = Path.Combine( Path.GetTempPath( ), filename  ) ;
	        RegistryKey key = Registry.CurrentUser.OpenSubKey( @"Control Panel\Desktop", true ) ;
		
		key.SetValue(@"WallpaperStyle", 2.ToString( ) ) ;
		key.SetValue(@"TileWallpaper", 0.ToString( ) ) ;
		
		SystemParametersInfo( SPI_SETDESKWALLPAPER, 
		0, 
		tempPath,  
		SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE );
	}
}
Die Methode ruf ich so auf:
Code:
Wallpaper cls = new Wallpaper();
cls.Set(@"C:\Cars\Test.JPG");
Aber Ich bekomm da einen grauen Bildschirm, was habe Ich falsch gemacht? Der Compiler zeigt keine Fehler an, keine Exceptions etc. :suspekt:

Danke für deine Hilfe! :)


MfG Alexander12
 
Wie wäre es, wenn du den Code, den ich gepostet habe anschaust, versuchst zu verstehen was da passiert und DANN mit deinem Code vergleichst? Dann wirst sofort sehen warum das nicht funktionieren kann.
 
Hi.

Also der erste Anlaufpunkt für mich wäre, dass Ich den URI-Parameter weggenommen habe.
Hm.. Da wird das Bild gespeichert ... Das könnts sein.. Was muss den der parameter Uri für ein Format haben, ein String funkt nicht, also der Pfad.


MfG Alexander12
 
Zum Thema Uri schaust jetzt mal ins MSDN. Hab keinen Bock dir Dinge, die du schneller rausfinden, als die Frage stellen kannst, zu erklären.
 
Hi.

Ich habe nach der Uri Klasse gesucht, bin fündig geworden und habe das Format geändert.
Doch nun kommt er mit "An Error has occured in GDI+" oder sowas, in dieser Zeile:
Code:
img.Save( tempPath ,  System.Drawing.Imaging.ImageFormat.Bmp ) ;
Ist mir unerklärlich, Ich habe doch alles richtig gemacht!?

Uri: "file:///C:/Cars/Test.JPG"


MfG Alexander12
 
Mal davon abgesehen, dass ich nicht versteh, warum du nicht die originale Klasse verwendest, solltest eben genau das tun.

Aufrufen kannst das ganze dann so:
Code:
 Wallpaper.Set( new Uri( "C:\\mypic.bmp" ), Wallpaper.Style.Tiled ) ;
 
Hi.

Hm.. Das funkt jetzt, da kommt kein Fehler. Aber der Error, mit der GDI+ (steht oben) tritt noch auf. Ich habe mal das Format geändert, dass kanns aber nicht sein.

Hier nochmal der Error:
Code:
Exception System.Runtime.InteropServices.ExternalException was thrown in debugee:
A generic error occurred in GDI+.

Save()
Save()
Set() - c:\Dokumente und Einstellungen\Besitzer\Eigene Dateien\SharpDevelop Projects\BackChanger1_0_beta_1\Class1.cs:30,3
Button1Click() - c:\Dokumente und Einstellungen\Besitzer\Eigene Dateien\SharpDevelop Projects\BackChanger1_0_beta_1\MainForm.cs:78,4
OnClick()
OnClick()
OnMouseUp()
WmMouseUp()
WndProc()
WndProc()
WndProc()
OnMessage()
WndProc()
DebuggableCallback()
System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop()
RunMessageLoopInner()
RunMessageLoop()
Run()
Main() - c:\Dokumente und Einstellungen\Besitzer\Eigene Dateien\SharpDevelop Projects\BackChanger1_0_beta_1\MainForm.cs:37,4
Hm.. Er markiert mir diese Zeile:
Code:
img.Save( tempPath ,  System.Drawing.Imaging.ImageFormat.Jpeg ) ;
Ich habe ja wie gesagt das Format geändert, ändert nichts, also liegts am tempPath, aber da gibts irgendwie auch keine Fehler.. :confused:


MfG Alexander12
 

Neue Beiträge

Zurück