Jak zmienić tapetę pulpitu przy użyciu kodu C#?Zmień tapetę pulpitu za pomocą kodu w .NET
Odpowiedz
Oto klasa szarpnął z aplikacji pisałem rok czy dwa lata temu:
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 System.Net.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);
}
}
nie testowałem go intensywnie, więc używać na własne ryzyko.
odpowiedź szczypanie Neal N za Gify:
private const int SPI_SETDESKWALLPAPER = 20;
private const int SPIF_UPDATEINIFILE = 0x01;
private const int SPIF_SENDWININICHANGE = 0x02;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);
public enum Style : int
{
Tiled,
Centered,
Stretched
}
/// <summary>
/// Loops numFrames times, animating the desktop background as the given gif.
/// Remember this will sorta bog down your computer, and probably isn't best to be running 24/7.
/// If numFrames is negative this will loop forever
/// </summary>
/// <param name="gifPath">The gif to be animated</param>
/// <param name="transparencyReplace">If the gif has transparency, it will be "replaced" with this color.</param>
/// <param name="framesPerSecond">How many frames to play per second. This is a max: most likely it will be a little slower than this especially at first.</param>
/// <param name="style">Whether to tile, center, or stretch each gif frame as it's played.</param>
/// <param name="numFrames">The number of frames to play. If negative, this method will loop forever.</param>
public static void SetDesktopBackgroundAsGifAsync(string gifPath, System.Drawing.Color transparencyReplace, int framesPerSecond, Style style, int numFrames)
{
Thread workerThread = new Thread(() => SetDesktopBackgroundAsGif(gifPath, transparencyReplace, framesPerSecond, style, numFrames));
workerThread.Start();
}
/// <summary>
/// Loops numFrames times, animating the desktop background as the given gif.
/// Remember this will sorta bog down your computer, and probably isn't best to be running 24/7.
/// If num frames is negative this will loop forever.
//// <summary>
/// <param name="gifPath">The gif to be animated</param>
/// <param name="backgroundImage">Image to render the gif on top of (because of transparency)</param>
/// <param name="framesPerSecond">How many frames to play per second. This is a max: most likely it will be a little slower than this.</param>
/// <param name="style">Whether to tile, center, or stretch each gif frame as it's played.</param>
/// <param name="numFrames">The number of frames to play. If negative, this method will loop forever.</param>
public static void SetDesktopBackgroundAsGifAsync(string gifPath, System.Drawing.Image backgroundImage, int framesPerSecond, Style style, int numFrames)
{
Thread workerThread = new Thread(() => SetDesktopBackgroundAsGif(gifPath, backgroundImage, framesPerSecond, style, numFrames));
workerThread.Start();
}
/// <summary>
/// Loops numFrames times, animating the desktop background as the given gif.
/// Remember this will sorta bog down your computer, and probably isn't best to be running 24/7.
/// if numFrames is negative this will loop forever
/// </summary>
/// <param name="gifPath">The gif to be animated</param>
/// <param name="transparencyReplace">If the gif has transparency, it will be "replaced" with this color.</param>
/// <param name="framesPerSecond">How many frames to play per second. This is a max: most likely it will be a little slower than this.</param>
/// <param name="style">Whether to tile, center, or stretch each gif frame as it's played.</param>
/// <param name="numFrames">The number of frames to play. If negative, this method will loop forever.</param>
public static void SetDesktopBackgroundAsGif(string gifPath, System.Drawing.Color transparencyReplace, int framesPerSecond, Style style, int numFrames)
{
if (!File.Exists(gifPath))
throw new Exception("Given gif: '" + gifPath + "' not found");
FileStream gifFile = new FileStream(gifPath, FileMode.Open);
GifBitmapDecoder gifDecoder = new GifBitmapDecoder(gifFile, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
if (gifDecoder.Frames.Count == 0)
throw new Exception("No frames in given gif");
Bitmap backgroundImage = new Bitmap(gifDecoder.Frames[0].PixelWidth, gifDecoder.Frames[0].PixelHeight, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
using(Graphics g = Graphics.FromImage(backgroundImage))
{
g.FillRectangle(new System.Drawing.SolidBrush(transparencyReplace), 0, 0, gifDecoder.Frames[0].PixelWidth, gifDecoder.Frames[0].PixelHeight);
}
gifFile.Close();
SetDesktopBackgroundAsGif(gifPath, backgroundImage, framesPerSecond, style, numFrames);
}
/// <summary>
/// Loops infinitely, animating the desktop background as the given gif.
/// Remember this will sorta bog down your computer, and probably isn't best to be running 24/7.
/// </summary>
/// <param name="gifPath">The gif to be animated</param>
/// <param name="backgroundImage">Image to render the gif on top of (because of transparency)</param>
/// <param name="framesPerSecond">How many frames to play per second. This is a max: most likely it will be a little slower than this.</param>
/// <param name="style">Whether to tile, center, or stretch each gif frame as it's played.</param>
/// <param name="numFrames">The number of frames to play. If negative, this method will loop forever.</param>
private static void SetDesktopBackgroundAsGif(string gifPath, System.Drawing.Image backgroundImage, int framesPerSecond, Style style, int numFrames)
{
if (!File.Exists(gifPath))
throw new Exception("Given gif: '" + gifPath + "' not found");
FileStream gifFile = new FileStream(gifPath, FileMode.Open);
GifBitmapDecoder gifDecoder = new GifBitmapDecoder(gifFile, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
if (gifDecoder.Frames.Count == 0)
throw new Exception("No frames in given gif");
Console.WriteLine("Saving frames to temporary files:");
int numFramesSoFar = 0;
for (int i = 0; i < gifDecoder.Frames.Count; i++)
{
BitmapFrame gifFrame = gifDecoder.Frames[i];
PngBitmapEncoder pngEncoder = new PngBitmapEncoder();
pngEncoder.Frames.Add(gifFrame);
MemoryStream pngStream = new MemoryStream();
pngEncoder.Save(pngStream);
Image frameImage = Image.FromStream(pngStream);
Bitmap bmp = new Bitmap(frameImage.Width, frameImage.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
using (Graphics g = Graphics.FromImage(bmp))
{
g.DrawImage(backgroundImage, 0, 0);
g.DrawImageUnscaled(frameImage, 0, 0);
}
string tempPath = Path.Combine(Path.GetTempPath(), gifPath + i + ".bmp");
bmp.Save(tempPath, System.Drawing.Imaging.ImageFormat.Bmp);
Console.WriteLine("Saved frame " + i);
numFramesSoFar++;
if (numFrames >= 0 && numFramesSoFar >= numFrames) break;
}
Console.WriteLine("Setting frames to desktop background at about " + framesPerSecond + " FPS");
// 1.0/... to convert to seconds per frame (instead of frames per second)
// * 1000 to convert to milliseconds per frame
// * 1000 to convert to microseconds per frame
// * 10 to convert to 0.1s of microseconds per frame = 100s of nanoseconds per frame
long ticksBetweenFrames = (long)Math.Round(1.0/framesPerSecond) * 1000*1000*10;
Stopwatch timer = new Stopwatch();
timer.Start();
numFramesSoFar = 0;
while(numFrames < 0 || numFramesSoFar < numFrames)
{
for (int i = 0; i < gifDecoder.Frames.Count; i++)
{
// Sleep until we're at the desired frame rate, if needed.
if(ticksBetweenFrames > timer.ElapsedTicks)
Thread.Sleep(new TimeSpan(Math.Max(0, ticksBetweenFrames - timer.ElapsedTicks)));
timer.Restart();
// From http://stackoverflow.com/a/1061682/2924421
string filePath = Path.Combine(Path.GetTempPath(), "wallpaper" + i + ".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,
filePath,
SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
numFramesSoFar++;
if (numFrames >= 0 && numFramesSoFar >= numFrames) break;
}
}
gifFile.Close();
}
Należy również pamiętać, że trzeba użyć:
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Media;
using System.Windows.Media.Imaging;
Wreszcie, kliknij prawym przyciskiem myszy na Project, Add Reference, oraz (w złożeniach i ram) dodaj Presentation Core, System.Xaml i WindowsBase.
Następnie kliknij prawym przyciskiem myszy na swój projekt i przejdź do właściwości, i upewnij się, że struktura docelowa to .Net Framework 4.5. Jeśli to zmienisz, konieczne może być ponowne uruchomienie programu Visual Studio.
Oczywiście to tłoczy maszynę. Istnieje blokująca nieskończona pętla z wywołaniem "Thread.Sleep" rzucanym w sposób chaotyczny. Istnieje wiele lepszych sposobów czekania, aż upłynie czas. –
Nie, myślę, że ma to więcej wspólnego z wywołaniem SystemParametersInfo (powiedzmy, 10 razy na sekundę). Pulpit nie jest odświeżany w ten sposób. Dowodzi tego "explorer" przechodzący od 0% do 6-12% użycia procesora, po prostu uruchamiając program, który wywołuje tę metodę. Poprawiłem jednak moją odpowiedź, dodając metody asynchroniczne i wykonując połączenie do wątku. Spuść mniej spamu (dzieje się tylko wtedy, gdy jest to konieczne). Jakieś inne poważne wątpliwości? – Phylliida
Zastanawiałem się nad poprawieniem tego wątku, aby zatrzymać wątki inną metodą, ale wydaje się, że to przesadzone dla metody, która prawdopodobnie nie jest dobrą praktyką w pierwszej kolejności. – Phylliida
Podstawy na this useful answer, Zrobiłem również my own app, aby ustawić rozdzielczość ekranu dopasowywania tapety.
Ale ustawienia rejestru były nieprawidłowe. Oto poprawne wartości (testowane na Win 7, Win 8.1, Win 10).
if (style == Style.Fill)
{
key.SetValue(@"WallpaperStyle", 10.ToString());
key.SetValue(@"TileWallpaper", 0.ToString());
}
if (style == Style.Fit)
{
key.SetValue(@"WallpaperStyle", 6.ToString());
key.SetValue(@"TileWallpaper", 0.ToString());
}
if (style == Style.Span) // Windows 8 or newer only!
{
key.SetValue(@"WallpaperStyle", 22.ToString());
key.SetValue(@"TileWallpaper", 0.ToString());
}
if (style == Style.Stretch)
{
key.SetValue(@"WallpaperStyle", 2.ToString());
key.SetValue(@"TileWallpaper", 0.ToString());
}
if (style == Style.Tile)
{
key.SetValue(@"WallpaperStyle", 0.ToString());
key.SetValue(@"TileWallpaper", 1.ToString());
}
if (style == Style.Center)
{
key.SetValue(@"WallpaperStyle", 0.ToString());
key.SetValue(@"TileWallpaper", 0.ToString());
}
Dlaczego używać (numer) .ToString()? Dlaczego nie "(liczba)"? – HighTechProgramming15
Oczywiście, że możesz. Jest to kwestia koncepcji - napisałem to w ten sposób, ponieważ zrobił to ktoś inny. – badsamaritan
- 1. Zmień styl z kodu za
- 2. WooCommerce - zmień status zamówienia za pomocą kodu php
- 3. Zabezpieczenia ciągów połączeń w aplikacji pulpitu .net
- 4. Zmień nazwę pola formularza za pomocą kodu JavaScript
- 5. Wyszukiwanie pulpitu systemu Windows za pomocą C#
- 6. Przechwytywanie zrzutów pulpitu za pomocą javascript
- 7. Uzyskaj wspólną ścieżkę pulpitu w .NET
- 8. Pobierz aktualną tapetę w Cocoa
- 9. Zmień tapetę na wszystkich komputerach w systemie OS X 10.7 Lion?
- 10. Zmień typ elementu wejściowego za pomocą jquery
- 11. Zmień wielkość liter za pomocą regex Javascriptu
- 12. Zmień ActionBar tytuł za pomocą Fragmenty
- 13. Zmień wartość wpisu tekstowego za pomocą css?
- 14. Zmień nazwę tabeli za pomocą migracji Doctrine
- 15. Zmień wartość pola tekstowego za pomocą jQuery
- 16. Zmień kolor tła za pomocą ng-Style
- 17. Generowanie kodu za pomocą Scala
- 18. Zmień nazwę środowiska za pomocą virtualenvwrapper
- 19. Dynamicznie zmień adres AddThis za pomocą jQuery
- 20. Zmień fragment strony podglądu za pomocą przyciskuKliknij
- 21. Zmień kolor tła za pomocą jQuery Mobile
- 22. Alembic: zmień typ kolumny za pomocą UŻYWANIA
- 23. Kodowanie za pomocą HttpClient w .NET 4.5
- 24. Zmień styl wcięć w vim za pomocą wtyczki Vim-R
- 25. Otrzymuj bieżącą tapetę
- 26. Manipulowanie obrazami za pomocą .NET Core
- 27. Zmień kursor HotSpot w WinForm/.NET
- 28. Powracaj DataTable za pomocą async .net 4.0
- 29. Zmień określoną wartość w pliku CSV za pomocą Pythona
- 30. Zmień wartość XML w pamięci za pomocą xQuery
Spowoduje to tylko ustawienie plików BMP. Jeśli chcę ustawić JPEG, jaka jest metoda? – Sauron
Nie wiem, czy system Windows obsługuje jpeg jako tapetę ... konwertuje inne obrazy do formatu bmp, zanim zostanie skonfigurowany jako tapeta (popraw mnie, jeśli się nie mylę), jeśli tak jest w przypadku konwersji w kodzie –
Używam to dla jpegów w porządku. Tylko dlatego, że nazywa się bmp w powyższym kodzie, nie ogranicza go. to * prawdopodobnie * zadziała dla pngs i gifów, jak również dla innych, ale ja tego nie zweryfikowałem. –