Как установить значок административного права на кнопке диалога MFC? - PullRequest
5 голосов
/ 23 августа 2011

Я создаю приложение в MFC с использованием Visual Studio 2008 в Windows 7. Мое приложение запускает и останавливает службу, которая требует административного доступа.Когда приложение запускается, оно не имеет административного доступа.Но когда я нажимаю кнопку запуска службы, он получает административный доступ и выполняет действие.Мне интересно, как установить значок администратора на кнопках, действия которых требуют административного доступа?Нужно ли устанавливать какие-то флаги?Спасибо

1 Ответ

6 голосов
/ 23 августа 2011

Начиная с Windows Vista, вы можете добавить значок щита к кнопке, используя один из новых флагов. Для этого есть макрос, который вы можете использовать так:

Button_SetElevationRequiredState(hwnd, TRUE);

Документация для макроса в http://msdn.microsoft.com/en-us/library/bb761865%28VS.85%29.aspx

См. http://msdn.microsoft.com/en-us/library/bb756990.aspx#BKMK_ShieldButton о том, как выполнять множество задач, связанных с UAC.

Существует также CButton :: SetElevationRequired (), которая, вероятно, делает то же самое, но в большей степени соответствует вашему проекту MFC. Вы можете использовать это так:

ctl->SetElevationRequired(TRUE);

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

Вам также нужно разрешить использование DLL общих элементов управления v6, что вы можете сделать либо с помощью файла манифеста (с помощью или без записи в файле ресурсов для его встраивания), либо с помощью директивы #pragma в своем коде для MSVC2005 или позже. С приложением MFC, скорее всего, у вас уже есть манифест, который вы можете изменить, но я не могу вам помочь, поскольку у меня нет доступа к MFC.

Если вы идете по пути манифеста, он должен выглядеть примерно так и иметь то же имя, что и ваше приложение, но с ".manifest" после .exe, например. 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>

Для #pragma см. Код ниже.

Дополнительную информацию об использовании общих элементов управления v6 смотрите по этой ссылке (откуда я получил вышеуказанную информацию): http://msdn.microsoft.com/en-us/library/bb773175%28v=vs.85%29.aspx

Небольшой пример win32, который использует директиву pragma для включения общих элементов управления v6 и отображает значок повышения:

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...