2010-03-19 38 views
5

Tôi có một chương trình vẫn phải nhắm mục tiêu Windows XP (_WIN32_WINNT 0x501), vì hầu hết khách hàng của chúng tôi vẫn sử dụng XP. Tuy nhiên, chúng tôi đã được vận chuyển Vista một thời gian, và bây giờ đang đẩy Windows 7 nâng cấp. Để phần mềm hoạt động chính xác trên các hệ điều hành mới hơn, có một vài hoạt động yêu cầu độ cao UAC. Tôi có mã nâng cao làm việc, nhưng muốn có biểu tượng UAC trên các nút khởi chạy tiến trình UAC. Thật không may, tất cả các tùy chọn được xác định trong Microsoft's UAC UI document yêu cầu _WIN32_WINNT 0x600 hoặc mới hơn.Cách thêm biểu tượng lá chắn UAC vào chương trình vẫn phải nhắm mục tiêu XP?

Có cách nào để có biểu tượng UAC thích hợp (Vista và 7 sử dụng biểu tượng khác) để hiển thị trên nút trong khi vẫn có thể nhắm mục tiêu XP (nơi biểu tượng không hiển thị) không? Tôi đang sử dụng C++, nhưng có thể thích ứng với một giải pháp .NET.

Trả lời

3

Sử dụng Button_SetElevationRequiredState và thêm một cái gì đó như:

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

này sẽ làm việc trên XP và Vista, và sẽ biên dịch bình thường cho tất cả các hệ thống mục tiêu.

1

Nếu bạn gửi một nút tin nhắn BCM_SETSHIELD trên XP, nó sẽ tự nói "hấp dẫn" và không có gì quan tâm. Nó chắc chắn sẽ không hiển thị một lá chắn. Vì vậy, bạn không cần phải ngăn mình gửi tin nhắn. Tuy nhiên, bạn nên chú ý đến các tính năng của hệ điều hành trước khi sử dụng chúng.

Nếu "quy trình UAC" bạn đang khởi chạy là một exe riêng biệt với tệp kê khai, các máy XP sẽ bỏ qua tệp kê khai và bạn sẽ không cần phải viết bất kỳ mã kiểm tra phiên bản nào nơi bạn khởi chạy.

Đây là loại mã phiên bản chéo tốt nhất để viết - không có gì trên các phiên bản cũ hơn nhưng bạn không chạy xung quanh thử nghiệm phiên bản một cách rõ ràng, hoặc xây dựng các phiên bản khác nhau cho các phiên bản khác nhau. Bạn sẽ không luôn luôn có thể đạt được điều đó.

Các vấn đề liên quan