Вопрос

Я остановился на этом методе, но не понимаю, почему он блокирует файл.Я считаю, что вы могли бы использовать что-то вроде

using( something)
{

//do stuff here
}

Но я не уверен, что это А) решило бы проблему или Б) было бы правильным способом, если бы это было так.

Любые идеи?

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

Обновленный код

 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();
            }
        }
    }
Это было полезно?

Решение

От MSDN:«Файл остается заблокированным, пока изображение не будет утилизировано». - Так что да, это должно быть исправлено:

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

(В качестве примечания: я бы сузил улов попытки только до вызовов .Save() и/или SystemParametersInfo())

Другие советы

Как только вы выйдете из с использованием блок, все объекты, инициализированные в нем, удаляются.В вашем случае объекты будут удалены, что снимет блокировку файла.

Вы должны удалить вручную (либо через с использованием заявление или позвонив .Dispose() на объекте) любые неуправляемые вызовы функций COM или Windows API (т. е.когда вы используете взаимодействие).

Вот что у меня есть, пожалуйста, дайте мне знать, если увидите что-нибудь, что я мог бы улучшить.Но он работает как чемпион, так что я очень доволен.

                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");
                    }
                }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top