Ive narrowed down to this method but i don't understand why its locking the file. I believe you could use something like
using( something)
{
//do stuff here
}
But im not sure that would A) solve the issue or B) be the correct way if it did.
any ideas?
[DllImport("user32.dll", CharSet = CharSet.Auto)]private static extern Int32 SystemParametersInfo(UInt32 action, UInt32 uParam, String vParam, UInt32 winIni);
private static readonly UInt32 SPI_SETDESKWALLPAPER = 0x14;
private static readonly UInt32 SPIF_UPDATEINIFILE = 0x01;
private static readonly UInt32 SPIF_SENDWININICHANGE = 0x02;
private void SetWallpaper(string path)
{
try
{
Image imgInFile = Image.FromFile(path);
imgInFile.Save(SaveFile, ImageFormat.Bmp);
SystemParametersInfo(SPI_SETDESKWALLPAPER, 3, SaveFile, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
}
catch
{
MessageBox.Show("error in setting the wallpaper");
}
}
#
Updated code
private void SetWallpaper(string path)
{
if (File.Exists(path))
{
Image imgInFile = Image.FromFile(path);
try
{
imgInFile.Save(SaveFile, ImageFormat.Bmp);
SystemParametersInfo(SPI_SETDESKWALLPAPER, 3, SaveFile, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
}
catch
{
MessageBox.Show("error in setting the wallpaper");
}
finally
{
imgInFile.Dispose();
}
}
}
Once you pass out of the using block, all objects initialized within it are disposed. In your case, the objects will be disposed which will remove the lock on the file.
You must manually dispose (either through a using statement or by calling .Dispose() on the object) any unmanaged calls to either COM or Windows API functions (i.e. when you use interop).
From MSDN: "The file remains locked until the Image is disposed." - so yes, this should be fixed by:
(As a side note, I would tighten the try catch to just the .Save() and/or SystemParametersInfo() calls)
Here is what i have please let me know if you see anything that i could pretty up. But its working like a champ so i'm pretty happy.