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ブロックを通過すると、ブロック内で初期化されたすべてのオブジェクトが破棄されます。あなたの場合、オブジェクトは破棄され、ファイルのロックが解除されます。

COM または Windows API 関数へのアンマネージ呼び出し (つまり、相互運用機能を使用する場合) は、 ( usingステートメントを使用するか、オブジェクトで.Dispose()を呼び出して)手動で破棄する必要があります。

于 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 に答える