2010-03-19 8 views
5

Tengo un programa que todavía debe apuntar a Windows XP (_WIN32_WINNT 0x501), ya que la mayoría de nuestros clientes todavía usan XP. Sin embargo, hemos estado enviando Vista por un tiempo, y ahora estamos impulsando las actualizaciones de Windows 7. Para que el software funcione correctamente en los SO más nuevos, hay un par de operaciones que requieren elevación de UAC. Tengo el código de elevación en funcionamiento, pero me gustaría tener el icono de UAC presente en los botones que inician el proceso de UAC. Desafortunadamente, todas las opciones definidas en Microsoft's UAC UI document requieren _WIN32_WINNT 0x600 o más reciente.¿Cómo agregar el ícono de escudo UAC al programa que aún debe apuntar a XP?

¿Hay alguna manera de obtener el icono de UAC apropiado (Vista y 7 usan diferentes) para mostrar en el botón mientras aún se puede orientar a XP (donde no se mostrará ningún icono)? Estoy usando C++, pero puedo adaptar una solución .NET.

Respuesta

3

Uso Button_SetElevationRequiredState y añadir algo como:

#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) 

Esto funcionará en XP y Vista, y será compilado normalmente para todos los sistemas de destino.

1

Si envía el botón un mensaje BCM_SETSHIELD en XP, se dirá a sí mismo "fascinante" y no hará nada de interés. Ciertamente no mostrará un escudo. Por lo tanto, no es necesario que evite enviar el mensaje. Aún así, es una buena idea prestar atención a las características de su sistema operativo antes de usarlas.

Si "el proceso de UAC" usted está lanzando es un EXE independiente con un manifiesto, las máquinas de XP ignorará el manifiesto y que no tendrá que escribir ningún código de comprobación de versión en la que poner en marcha.

Este es el mejor tipo de código de versión cruzada para escribir: no hace nada en versiones anteriores, pero no está probando explícitamente la versión en tiempo de ejecución ni construyendo versiones diferentes para versiones diferentes. No siempre podrás lograr eso.

Cuestiones relacionadas