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 回答