2010-03-19 5 views
5

Ich habe ein Programm, das immer noch auf Windows XP (_WIN32_WINNT 0x501) ausgerichtet sein muss, da die meisten unserer Kunden noch XP verwenden. Allerdings haben wir Vista für eine Weile ausgeliefert und drängen Windows 7-Upgrades. Damit die Software korrekt auf den neueren Betriebssystemen funktioniert, gibt es einige Operationen, die eine UAC-Erhöhung erfordern. Der Höhencode funktioniert, aber ich möchte, dass das UAC-Symbol auf den Schaltflächen angezeigt wird, mit denen der UAC-Prozess gestartet wird. Leider erfordern alle in Microsoft's UAC UI document definierten Optionen _WIN32_WINNT 0x600 oder neuer.Wie fügt man das UAC Shield Icon zu einem Programm hinzu, das XP als Ziel haben soll?

Gibt es eine Möglichkeit, das entsprechende UAC-Symbol (Vista und 7 verwenden verschiedene) auf der Schaltfläche anzuzeigen, während XP immer noch anzielen kann (wo kein Symbol angezeigt wird)? Ich benutze C++, kann aber möglicherweise eine .NET-Lösung anpassen.

Antwort

3

Verwenden Button_SetElevationRequiredState und fügen Sie so etwas wie:

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

Dies wird auf XP und Vista arbeiten, und werden in der Regel für alle Zielsysteme zusammengestellt.

1

Wenn Sie die Schaltfläche eine BCM_SETSHIELD Nachricht auf XP senden, wird es sich selbst "faszinierend" sagen und nichts von Interesse tun. Es wird sicherlich keinen Schild zeigen. Sie müssen sich also nicht davon abhalten, die Nachricht zu senden. Dennoch ist es ein guter Gedanke, vor der Verwendung auf die Funktionen Ihres Betriebssystems zu achten.

Wenn der von Ihnen gestartete UAC-Prozess eine separate EXE mit einem Manifest ist, ignorieren die XP-Maschinen das Manifest und Sie müssen keinen Versionsüberprüfungscode eingeben, an dem Sie ihn starten.

Dies ist die beste Art von versionsübergreifendem Code zum Schreiben - es macht nichts mit älteren Versionen, aber Sie laufen nicht herum, testen explizit die Version zur Laufzeit oder erstellen verschiedene Exes für verschiedene Versionen. Das wird nicht immer möglich sein.