5

我已经缩小到这种方法,但我不明白为什么它会锁定文件。我相信你可以使用类似的东西

using( something)
{

//do stuff here
}

但我不确定 A) 是否会解决问题或 B) 是否是正确的方法。

有任何想法吗?

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

3 回答 3

15

来自MSDN:“在处理图像之前,文件保持锁定状态。” - 所以是的,这应该通过以下方式解决:

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

(作为旁注,我会将 try catch 收紧到 .Save() 和/或 SystemParametersInfo() 调用)

于 2009-04-30T01:48:31.077 回答
1

一旦你离开using块,所有在其中初始化的对象都会被释放。在您的情况下,将处理对象,这将删除文件上的锁定。

您必须手动处理(通过using语句或通过在对象上调用.Dispose())对 COM 或 Windows API 函数的任何非托管调用(即,当您使用互操作时)。

于 2009-04-30T01:52:14.110 回答
0

这是我所拥有的,如果你看到任何我可以修饰的东西,请告诉我。但它像冠军一样工作,所以我很高兴。

                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");
                    }
                }
于 2009-04-30T04:54:25.577 回答