Как добавить значок щита контроля учётных записей для программирования, это все еще должно предназначаться для XP?

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

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

5
задан bsruth 19 March 2010 в 22:16
поделиться

2 ответа

Используйте 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, и будет нормально компилироваться для всех целевых систем.

3
ответ дан 15 December 2019 в 00:57
поделиться

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

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

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

1
ответ дан 15 December 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: