Как добавить значок щита UAC в программу, которая все еще должна предназначаться для XP? - PullRequest
5 голосов
/ 20 марта 2010

У меня есть программа, которая все еще должна предназначаться для Windows XP (_WIN32_WINNT 0x501), так как большинство наших клиентов все еще используют XP. Тем не менее, мы уже некоторое время поставляем Vista, и сейчас настаиваем на обновлениях Windows 7. Для правильной работы программного обеспечения на новых ОС существует пара операций, которые требуют повышения уровня контроля учетных записей. У меня работает код повышения, но хотелось бы, чтобы значок UAC присутствовал на кнопках, запускающих процесс UAC. К сожалению, для всех параметров, определенных в документе Microsoft UAC UI , требуется _WIN32_WINNT 0x600 или более поздняя версия.

Есть ли какой-нибудь способ получить соответствующий значок UAC (Vista и 7 используют разные) для отображения на кнопке, в то же время имея возможность выбрать XP (где значок не будет отображаться)? Я использую C ++, но, возможно, смогу адаптировать решение .NET.

Ответы [ 2 ]

3 голосов
/ 20 марта 2010

Используйте Button_SetElevationRequiredState и добавьте что-то вроде:

#if ! defined(BCM_FIRST)
#define BCM_FIRST               0x1600
#define BCM_SETSHIELD  (BCM_FIRST + 0x000C)
#define Button_SetElevationRequiredState(hwnd, fRequired) \
 (LRESULT)SNDMSG((hwnd), BCM_SETSHIELD, 0, (LPARAM)fRequired)
#endif // #if ! defined(BCM_FIRST)

Это будет работать в XP и Vista и будет нормально скомпилировано для всех целевых систем.

1 голос
/ 20 марта 2010

Если вы отправите кнопке сообщение BCM_SETSHIELD в XP, она скажет себе "увлекательно" и не будет делать ничего интересного. Это, конечно, не будет отображать щит. Поэтому вам не нужно мешать себе отправлять сообщение. Тем не менее, стоит обратить внимание на функции вашей ОС перед их использованием.

Если запускаемый вами «процесс UAC» - это отдельный exe-файл с манифестом, машины XP будут игнорировать манифест, и вам не нужно будет писать код проверки версии при запуске.

Это лучший вид кросс-версии кода для написания - он ничего не делает на старых версиях, но вы не испытываете явное тестирование версии во время выполнения или сборку разных exe-файлов для разных версий. Вы не всегда сможете достичь этого.

...