我正在编写一段代码,删除我们在用户开始菜单中的一个额外文件夹。我首先删除它包含的所有快捷方式,然后删除文件夹本身。
完成此操作后,我可以确认快捷方式已从开始菜单中删除,但其包含的文件夹仍列在开始菜单中。因此,我检查了文件系统中是否有这样的文件夹,但没有找到。怀疑这是某种刷新问题,我将用户注销并重新登录到 Vista,发现该文件夹现在已从开始菜单列表中删除。
多么令人讨厌......有谁知道如何以编程方式强制“刷新”Vista开始菜单,以便用户在注销之前看不到这个空文件夹?
谢谢,-本
我正在编写一段代码,删除我们在用户开始菜单中的一个额外文件夹。我首先删除它包含的所有快捷方式,然后删除文件夹本身。
完成此操作后,我可以确认快捷方式已从开始菜单中删除,但其包含的文件夹仍列在开始菜单中。因此,我检查了文件系统中是否有这样的文件夹,但没有找到。怀疑这是某种刷新问题,我将用户注销并重新登录到 Vista,发现该文件夹现在已从开始菜单列表中删除。
多么令人讨厌......有谁知道如何以编程方式强制“刷新”Vista开始菜单,以便用户在注销之前看不到这个空文件夹?
谢谢,-本
这篇文章似乎有你正在寻找的答案:
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);
}
}
我尝试自己实现这一点,但使用 SendMessageTimeout 并没有按预期工作。
相反,当我使用 SHGetSpecialFolderLocation(CSIDL_STARTMENU) SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_IDLIST, pidl, NULL);
有关示例 C++ 代码,请参阅本文:http: //support.microsoft.com/kb/q193293/
在带有 SP1 的 Windows Server 2008 Enterprise (x86) 上进行了测试。