2011-08-23 2 views
5

Sto creando un'applicazione in MFC utilizzando Visual Studio 2008 in Windows 7. La mia applicazione avvia e arresta un servizio che richiede l'accesso amministrativo. All'avvio dell'applicazione non ha accesso amministrativo. Ma quando clicco su start service button ottiene l'accesso amministrativo ed esegue l'azione. Mi chiedo come impostare l'icona amministrativa sui pulsanti le cui azioni necessitano di accesso amministrativo? Devo impostare qualche tipo di Bandiere? GrazieCome impostare l'icona destra amministrativa sul pulsante di dialogo MFC?

risposta

6

A partire da Windows Vista è possibile aggiungere l'icona scudo a un pulsante utilizzando uno dei nuovi flag. C'è una macro per attivarla, che può essere utilizzato in questo modo:

Button_SetElevationRequiredState(hwnd, TRUE); 

Documentazione per la macro è in http://msdn.microsoft.com/en-us/library/bb761865%28VS.85%29.aspx

Vedere http://msdn.microsoft.com/en-us/library/bb756990.aspx#BKMK_ShieldButton per una panoramica di come fare molte attività legate UAC.

C'è anche CButton :: SetElevationRequired() che presumibilmente fa la stessa cosa ma si adatta più in linea con il tuo progetto MFC. Si potrebbe utilizzare in questo modo:

ctl->SetElevationRequired(TRUE); 

Vedi http://msdn.microsoft.com/en-us/library/bb386824%28v=VS.90%29.aspx

È inoltre necessario per consentire l'utilizzo dei controlli comuni v6 DLL, che si può fare sia utilizzando un file manifesto (con o witout una voce il tuo file di risorse per incorporarlo) o utilizzando una direttiva #pragma nel codice per MSVC2005 o successivo. È probabile che con un'applicazione MFC sia già presente un manifest che è possibile modificare, ma non posso aiutarti perché non ho accesso a MFC.

Se si passa al percorso manifest, dovrebbe apparire simile a questo e avere lo stesso nome dell'applicazione ma con ".manifest" dopo l'exe, ad es. MyApp.exe.manifest:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
<assemblyIdentity 
    version="1.0.0.0" 
    processorArchitecture="*" 
    name="CompanyName.ProductName.YourApplication" 
    type="win32" 
/> 
<description>Your application description here.</description> 
<dependency> 
    <dependentAssembly> 
     <assemblyIdentity 
      type="win32" 
      name="Microsoft.Windows.Common-Controls" 
      version="6.0.0.0" 
      processorArchitecture="*" 
      publicKeyToken="6595b64144ccf1df" 
      language="*" 
     /> 
    </dependentAssembly> 
</dependency> 
</assembly> 

Per il # pragma, vedere il codice di seguito.

Per ulteriori informazioni sull'utilizzo v6 controlli comuni vedono questo link (che è dove ho ottenuto le suddette informazioni da): http://msdn.microsoft.com/en-us/library/bb773175%28v=vs.85%29.aspx

Un piccolo esempio win32 che utilizza la direttiva pragma per consentire controlli comuni v6 e visualizza l'elevazione icona:

#include <windows.h> 
#include <commctrl.h> 
#include <stdio.h> 

#pragma comment(linker,"\"/manifestdependency:type='win32' \ 
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ 
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") 

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM); 

int WINAPI WinMain (HINSTANCE instance, 
        HINSTANCE previnst, 
        LPSTR args, 
        int wndState) 
{ 
    int i; 
    MSG messages; 
    WNDCLASSEX wincl; 
    ZeroMemory(&wincl, sizeof(wincl)); 
    wincl.hInstance = instance; 
    wincl.lpszClassName = L"WindowsApp"; 
    wincl.lpfnWndProc = WindowProcedure; 
    wincl.style = CS_DBLCLKS; 
    wincl.cbSize = sizeof wincl; 
    wincl.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1); 

    InitCommonControls(); 

    wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    wincl.hCursor = LoadCursor(NULL, IDC_ARROW); 

    if (!RegisterClassEx (&wincl)) 
     return 0; 

    HWND hwnd = CreateWindow(L"WindowsApp", L"Windows App", WS_OVERLAPPEDWINDOW, 
     CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL, instance, NULL); 

    HWND hButton = CreateWindow(L"BUTTON", L"Do something", WS_TABSTOP | WS_VISIBLE | WS_CHILD, 10, 10, 200, 23, hwnd, NULL, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL); 

    SendMessage(hButton, WM_SETFONT, (LPARAM) GetStockObject(DEFAULT_GUI_FONT), FALSE); 
    Button_SetElevationRequiredState(hButton, TRUE); 

    ShowWindow(hwnd, wndState); 

    while (GetMessage(&messages, NULL, 0, 0) > 0) 
    { 
     TranslateMessage(&messages); 
     DispatchMessage(&messages); 
    } 
    return messages.wParam; 
} 

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
     case WM_DESTROY: 
      PostQuitMessage(0); 
      break; 

     default: 
      return DefWindowProc (hwnd, message, wParam, lParam); 
    } 

    return 0; 
} 
+0

Ho provato questo ma non ha mostrato l'icona scudo sul pulsante. Mi può fornire un modello di codice di esempio? Grazie –

+0

@Ali Ahmed: Ho aggiunto un esempio e più spiegazioni. – tinman