こんにちは、Platform SDK (Windows SDK) サポートチームです。 今回はショートカット アイコン削除時にデスクトップの再描画が遅い場合がある現象についてお知らせします。
概要
DeleteFile 関数でショートカットのアイコンを削除した直後に、デスクトップ画面から削除したアイコンがすぐに消えずに表示されたままになる時があります。
F5 キー を押すと、デスクトップ画面の再描画処���が実施されるため、表示されたままのアイコンが消えます。
詳細
本現象は、アイコンの削除処理が大きく二つの段階に分かれて行われるために発生しています。
- DeleteFile 関数による .lnk ファイル本体の削除
- Explorer によるデスクトップ画面の再描画処理
本現象が発生した際も、DeleteFile 関数の呼び出しは成功しており、ファイル システム上でも .lnk ファイルは正常に削除されています。
ところが、Explorer によるデスクトップ画面の再描画処理が行われていないために、ファイル システム上は削除されている .lnk ファイルのアイコンがデスクトップから消えずに、表示されたまま残っています。
表示上は .lnk ファイルが削除されていないように見えますが、ファイル システム上の .lnk ファイルの管理情報が壊れている状態ではないため、アイコンの再作成や削除は継続可能となります。
回避方法
本現象を回避するには、F5 キーを押して画面のリフレッシュを行うか、アイコンの削除 (DeleteFile 関数) の後に、以下の処理を追加します。
1. SHGetSpecialFolderLocation 関数の第二パラメータに CSIDL_DESKTOP を指定し、デスクトップの ITEMIDLIST を取得します。
2. 取得した ITEMIDLIST を利用し、マイ コンピュータの状態が更新されたことを通知します。
変更方法例:
std::string strTmp= std::string( GetFilePath());
strTmp += "\\test.lnk";
DeleteFile(strTmp.c_str());
//以下を追加します
LPITEMIDLIST pidl;
SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &pidl);
SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_IDLIST, pidl, NULL);
------
参考情報
上記関数の詳細に関しましては、以下の URL をご参照ください。
SHGetSpecialFolderLocation function
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762203.aspx
SHChangeNotify function
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762118.aspx
対象製品
Windows 7
Windows 8/8.1
Windows 10