В соответствии с описанием для элемента guidItem структуры NOTIFYICONDATA в http://msdn.microsoft.com/en-us/library/bb773352(v=vs.85).aspx программам, использующим системный трей Windows, необходимо идентифицировать их значок с действительным GUID в Windows 7. Я сделал это, но я сталкиваюсь с проблемой. Если мое приложение выполняется в каталоге A, а затем пользователь в какой-то момент решает переместить его и запустить его в каталоге B, когда программа выполняет вызов Shell_NotifyIcon, она завершается неудачно (возвращает 0) с GetLastError, установленным в 1460 (ERROR_TIMEOUT).
Если вы прочтете в самом низу этой статьи MSDN пункт 2 для поиска и устранения неисправностей, в основном описывается, что программы, идентифицирующие значок на панели задач с GUID, не могут изменить пути или это произойдет. В нем также есть эта интересная небольшая реклама:
Если необходимо изменить путь, приложение должно удалить любой GUID
информация, которая была добавлена при регистрации существующего значка.
Кто-нибудь знает вызов Win32 API или способ сделать это? Предположительно, это будет функция, принимающая GUID, который я хочу удалить, и вызов ее удалит все настройки для любого exe-файла, который Windows определил как использующий этот GUID. Если это так, я могу настроить свою программу на попытку вызова Shell_NotifyIcon, а затем, если она не удастся, я вызову функцию, чтобы очистить все и попытаться снова.
Единственный другой вариант, который я могу придумать, - разрешить программе, которая может запускаться в нескольких местах (не в одно и то же время), использовать один и тот же GUID для значка на панели задач, - просто изменить настройки в реестре в соответствии с этой статьей: http://deployment.xtremeconsulting.com/2011/07/08/windows-7-notification-area-automation-falling-back-down-the-binary-registry-rabbit-hole/ Я хотел бы избежать этого подхода, если это возможно, по понятным причинам.
Любая помощь по этому вопросу будет принята с благодарностью.