У меня есть программа, которая все еще должна предназначаться для Windows XP (_WIN32_WINNT 0x501), поскольку большинство наших клиентов все еще использует XP. Однако мы поставляли Vista некоторое время и теперь продвигаем обновления Windows 7. Чтобы программное обеспечение работало правильно над более новым OSs, существует пара операций, которые требуют повышения контроля учётных записей. Я имею работу кода повышения, но хотел бы иметь подарок значка UAC на кнопках, которые запускают процесс контроля учётных записей. К сожалению, все опции, определенные в контроле учётных записей Microsoft документ UI, требуют _WIN32_WINNT 0x600 или более новый.
Там какой-либо путь состоит в том, чтобы получить соответствующий значок UAC (Vista, и 7 используют различные) показать на кнопке в то время как все еще способность предназначаться для XP (где никакой значок не покажут)? Я использую C++, но могу адаптировать решение.NET.
Используйте 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, и будет нормально компилироваться для всех целевых систем.
Если вы отправите кнопке сообщение BCM_SETSHIELD на XP, она скажет себе "увлекательно" и не сделает ничего интересного. Она, конечно, не отобразит щит. Поэтому вам не нужно запрещать себе отправлять это сообщение. Тем не менее, это хорошая мысль - обратить внимание на функции ОС, прежде чем использовать их.
Если "процесс UAC", который вы запускаете, является отдельным exe с манифестом, машины XP будут игнорировать манифест, и вам не нужно будет писать код проверки версий там, где вы его запускаете.
Это лучший вид кросс-версионного кода для написания - он ничего не делает на старых версиях, но вы не бегаете вокруг, явно проверяя версию во время выполнения, и не собираете разные экзы для разных версий. Вы не всегда сможете этого добиться.