Pergunta

Ive reduzida a este método, mas eu não entendo por que a sua bloqueando o arquivo. Eu acredito que você poderia usar algo como

using( something)
{

//do stuff here
}

Mas eu não tenho certeza que A) resolver a questão ou B) ser o caminho correto se ele fez.

todas as idéias?

[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 atualizado

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

Solução

A partir MSDN : "Os restos de arquivo bloqueado até que a imagem é descartado." - Então, sim, este deve ser fixado por:

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

(Como uma nota lateral, eu iria apertar a try catch para apenas o .Save () e / ou SystemParametersInfo () chamadas)

Outras dicas

Uma vez que você passar para fora do usando bloco, todos os objetos inicializados dentro dele são eliminados. No seu caso, os objetos serão eliminados que irá remover o bloqueio no arquivo.

Você deve manualmente dispose (seja através de um usando declaração ou ligando para .Dispose () no objeto) quaisquer chamadas não gerenciadas a qualquer COM ou do Windows funções da API (ie quando você usa interoperabilidade).

Aqui está o que eu tenho por favor me avise se você ver qualquer coisa que eu poderia muito para cima. Mas o seu trabalho como um campeão assim que eu sou muito 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top