4

ユーザーのスタート メニューにある余分なフォルダーを削除するコードに取り組んでいます。まず、そこに含まれるすべてのショートカットを削除してから、フォルダー自体を削除します。

これが完了すると、ショートカットがスタート メニューから削除されたことを確認できますが、それらを含むフォルダーはスタート メニューにリストされたままです。そのため、そのようなフォルダーのファイル システムを確認しましたが、何も見つかりませんでした。これはある種の更新の問題ではないかと疑い、ユーザーをログアウトして Vista に戻したところ、フォルダがスタート メニュー リストから削除されていることがわかりました。

非常に面倒です... Vistaのスタートメニューをプログラムで強制的に「更新」して、ユーザーがログアウトする前にこの空のフォルダが表示されないようにする方法を知っている人はいますか?

ありがとう - ベン

4

2 に答える 2

2

この記事には、あなたが探している答えがあるようです:

http://social.msdn.microsoft.com/forums/en-US/winforms/thread/ce540c7d-a113-4f39-956e-0af6bc91abd3/

与えられた答えは次のとおりです。

class Program
 {
  [DllImport("user32.dll", SetLastError = true)]
  private static extern IntPtr SendMessageTimeout ( IntPtr hWnd, int Msg, IntPtr wParam, string lParam, uint fuFlags, uint uTimeout, IntPtr lpdwResult );

  private static readonly IntPtr HWND_BROADCAST = new IntPtr(0xffff);
  private const int WM_SETTINGCHANGE = 0x1a;
  private const int SMTO_ABORTIFHUNG = 0x0002;

  static void Main ( string[] args )
  {
   SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, IntPtr.Zero, null, SMTO_ABORTIFHUNG, 100, IntPtr.Zero);
  }
 }
于 2010-02-24T18:05:23.163 に答える
2

これを自分で実装しようとしましたが、SendMessageTimeout を使用して期待どおりに動作しませんでした。

代わりに、 SHGetSpecialFolderLocation(CSIDL_STARTMENU) SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_IDLIST, pidl, NULL); を使用すると機能しました。

サンプルの C++ コードについては、次の記事を参照してください: http://support.microsoft.com/kb/q193293/

SP1 を適用した Windows Server 2008 Enterprise (x86) でテスト済み。

于 2010-10-12T02:33:45.453 に答える