2011-08-23 1121 views
5

Estoy creando una aplicación en MFC usando Visual Studio 2008 en Windows 7. Mi aplicación inicia y detiene un servicio que requiere acceso administrativo. Cuando se inicia la aplicación, no tiene acceso administrativo. Pero cuando hago clic en el botón iniciar servicio obtengo el acceso administrativo y realizo la acción. Me pregunto cómo configurar el ícono administrativo en los botones cuyas acciones necesitan acceso administrativo. ¿Debo configurar algún tipo de Flags? GraciasCómo configurar el icono de la derecha administrativa en el botón de diálogo MFC?

Respuesta

6

A partir de Windows Vista, puede agregar el icono del escudo a un botón utilizando uno de los nuevos indicadores. Hay una macro para que pueda, que se puede utilizar de esta manera:

Button_SetElevationRequiredState(hwnd, TRUE); 

Documentación para la macro está en http://msdn.microsoft.com/en-us/library/bb761865%28VS.85%29.aspx

Ver http://msdn.microsoft.com/en-us/library/bb756990.aspx#BKMK_ShieldButton para una visión general de cómo hacer muchas tareas relacionadas con la UAC.

También hay CButton :: SetElevationRequired() que presumiblemente hace lo mismo pero se ajusta más a la línea de su proyecto MFC. Se podía utilizar de esta manera:

ctl->SetElevationRequired(TRUE); 

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

También es necesario permitir el uso de los controles comunes v6 DLL, que se puede hacer ya sea usando un archivo de manifiesto (con o witout una entrada en su archivo de recursos para incrustarlo) o usando una directiva #pragma en su código para MSVC2005 o posterior. Lo más probable es que con una aplicación MFC ya tenga un manifiesto que puede modificar, pero no puedo ayudarlo porque no tengo acceso a MFC.

Si va por la ruta del manifiesto, debe tener el siguiente aspecto y tener el mismo nombre que su aplicación, pero con ".manifest" después del .exe, p. Ej. 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> 

Para #pragma, consulte el código siguiente.

Para obtener más información sobre el uso v6 controles comunes ver este enlace (que es donde me dieron la información anterior desde): http://msdn.microsoft.com/en-us/library/bb773175%28v=vs.85%29.aspx

Un pequeño ejemplo Win32 que utiliza la directiva pragma para permitir controles comunes v6 y muestra la elevación icono:

#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

Intenté esto pero no mostró el icono del escudo en el botón. ¿Puedes por favor proporcionarme una plantilla de código de muestra? Gracias –

+0

@ Ali Ahmed: He agregado un ejemplo y más explicación. – tinman

Cuestiones relacionadas