Как программно «обновить» меню «Пуск» Vista - PullRequest
4 голосов
/ 24 февраля 2010

Я работаю над фрагментом кода, который удаляет лишнюю папку, которая есть в меню «Пуск» пользователя. Я начинаю с удаления всех ярлыков, которые в нем содержатся, а затем удаляю саму папку.

После того, как это будет сделано, я могу подтвердить, что ярлыки были удалены из меню «Пуск», но содержащая их папка остается в списке в меню «Пуск». Итак, я проверил файловую систему для такой папки и не нашел ни одной. Подозревая, что это какая-то проблема с обновлением, я вышел из системы и вернулся в Vista и обнаружил, что папка теперь удалена из списка меню «Пуск».

Как сильно раздражает ... Кто-нибудь знает, как программно принудительно обновить "меню" запуска Vista, чтобы пользователь не видел эту пустую папку до выхода из системы?

Спасибо, -Бен

Ответы [ 2 ]

2 голосов
/ 12 октября 2010

Я пытался реализовать это сам, но он не работал должным образом с использованием SendMessageTimeout.

Вместо этого он работал, когда я использовал SHGetSpecialFolderLocation (CSIDL_STARTMENU) SHChangeNotify (SHCNE_UPDATEDIR, SHCNF_IDLIST, pidl, NULL);

См. Эту статью для примера кода C ++: http://support.microsoft.com/kb/q193293/

Протестировано на Windows Server 2008 Enterprise (x86) с пакетом обновления 1 (SP1).

2 голосов
/ 24 февраля 2010

Эта статья, кажется, имеет ответ, который вы ищете:

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);
  }
 }
...