Pregunta

He reducido este método pero no entiendo por qué está bloqueando el archivo. Creo que podrías usar algo como

using( something)
{

//do stuff here
}

Pero no estoy seguro de que A) resolvería el problema o B) sería la forma correcta si lo hiciera.

alguna idea?

[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");
        }
    }
#

Código actualizado

 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();
            }
        }
    }
¿Fue útil?

Solución

De MSDN : " El archivo permanece bloqueado hasta que La imagen está dispuesta. & Quot; - entonces sí, esto debería ser arreglado por:

using (Image imgInFile ...) { ... }

(Como nota al margen, ajustaría el retén de prueba solo a las llamadas .Save () y SystemParametersInfo ())

Otros consejos

Una vez que salga del bloque utilizando , se eliminarán todos los objetos inicializados dentro de él. En su caso, los objetos se eliminarán, lo que eliminará el bloqueo del archivo.

Debe eliminar manualmente (ya sea mediante una declaración utilizando o llamando a .Dispose () en el objeto) todas las llamadas no administradas a las funciones COM o API de Windows (es decir, cuando usas interoperabilidad).

Esto es lo que tengo, por favor, avíseme si ve algo que pueda mejorar. Pero está funcionando como un campeón, así que estoy muy feliz.

                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();
                        }
                    }

                    Else
                    {
                          messagebox.show("Error with path: "+path+" Not found or in use");
                    }
                }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top