如何以编程方式“刷新”Vista开始菜单

时间:2010-02-24 17:37:02

标签: c# refresh windows-vista startmenu

我正在编写一段代码,删除用户开始菜单中的额外文件夹。我首先删除它包含的所有快捷方式,然后删除文件夹本身。

完成此操作后,我可以确认快捷方式已从开始菜单中删除,但其包含的文件夹仍保留在开始菜单中。所以,我检查了文件系统中的这样一个文件夹,但没有找到。怀疑这是某种刷新问题,我将用户退出并重新登录Vista,发现该文件夹现已从开始菜单列表中删除。

多么令人讨厌...有没有人知道如何以编程方式强制Vista开始菜单的'刷新',以便用户在注销之前不会看到这个空文件夹?

谢谢, -ben

2 个答案:

答案 0 :(得分: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);
  }
 }

答案 1 :(得分: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)上进行测试。