ショートカット アイコン削除時にデスクトップの再描画処理が行われない場合がある

こんにちは、Platform SDK (Windows SDK) サポートチームです。 今回はショートカット アイコン削除時にデスクトップの再描画が遅い場合がある現象についてお知らせします。

概要

ショートカット アイコンの作成、削除を連続して行うと、 DeleteFile 関数にてショートカットアイコンを削除後、デスクトップ画面から削除したアイコンが、すぐに消えずに表示されたままになることがあります。

F5 キー を押すと、デスクトップ画面の再描画処理が実施されるため、表示されたままのアイコンを消すことができます。

詳細

ショートカット アイコンの削除処理は、下記二つの段階に分かれて行われます。

1. DeleteFile 関数による .lnk ファイル本体の削除

2. Explorer によるデスクトップ画面の再描画処理

ショートカット アイコンの作成、削除を連続して行うと、「2. Explorer によるデスクトップ画面の再描画処理」が行われない場合があります。

このため、アイコンがデスクトップから消えずに、表示されたまま残ってしまいます。

ただし、本現象が発生した際も、以下の処理は成功しています。

・ DeleteFile 関数の呼び出し

・ ファイルシステム上の .lnk ファイルの削除

また、ファイル システム上の .lnk ファイルの管理情報は壊れていないため、アイコンの再作成や削除は継続可能です。

回避方法

本現象を回避するには、F5 キーを押して画面のリフレッシュを行うか、アイコンの削除 (DeleteFile 関数) のあとに、以下の処理を追加します。

1. SHGetSpecialFolderLocation 関数の第二パラメータに CSIDL_DESKTOP を指定し、デスクトップの ITEMIDLIST を取得します。

2. 取得した ITEMIDLIST を利用し、デスクトップの状態が更新されたことを通知します。

変更方法例:

// DeleteFile 関数の後に、デスクトップの状態をリフレッシュさせる処理を追加します。

LPITEMIDLIST pidl;

SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &pidl);

SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_IDLIST, pidl, NULL);

------

参考情報

上記関数の詳細に関しましては、以下の URL をご参照ください。

SHGetSpecialFolderLocation function

https://msdn.microsoft.com/en-us/library/windows/desktop/bb762203.aspx

SHChangeNotify function

https://msdn.microsoft.com/en-us/library/windows/desktop/bb762118.aspx

対象製品

Windows Vista

Windows 7

Windows 8/8.1

Windows 10