2011-08-23 11 views
5

Tworzę aplikację w MFC używając Visual Studio 2008 w Windows 7. Moja aplikacja uruchamia się i zatrzymuje usługę, która wymaga dostępu administracyjnego. Po uruchomieniu aplikacji nie ma dostępu administracyjnego. Ale kiedy klikam przycisk Uruchom usługę, otrzymuję dostęp administracyjny i wykonuję akcję. Zastanawiam się, jak ustawić ikonę administracyjną na przyciskach, których działania wymagają dostępu administracyjnego? Czy muszę ustawić jakieś flagi? DziękiJak ustawić uprawnienia administracyjne Ikona na przycisku dialogowym MFC?

Odpowiedz

6

Od systemu Windows Vista można dodać ikonę tarczy do przycisku za pomocą jednej z nowych flag. Jest to makro, aby ją włączyć, których można używać tak:

Button_SetElevationRequiredState(hwnd, TRUE); 

Dokumentacja dla makra jest w http://msdn.microsoft.com/en-us/library/bb761865%28VS.85%29.aspx

Zobacz http://msdn.microsoft.com/en-us/library/bb756990.aspx#BKMK_ShieldButton na przegląd, jak to zrobić wiele zadań związanych UAC.

Istnieje również funkcja CButton :: SetElevationRequired(), która prawdopodobnie robi to samo, ale pasuje bardziej do projektu MFC. Można używać go tak:

ctl->SetElevationRequired(TRUE); 

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

Należy również umożliwić korzystanie z Common Controls V6 DLL, który można zrobić albo za pomocą pliku manifestu (z lub witout wpisu plik zasobów, aby go osadzić) lub za pomocą dyrektywy #pragma w kodzie dla MSVC2005 lub nowszego. Jest szansa, że ​​aplikacja MFC będzie miała już manifest, który możesz zmodyfikować, ale nie mogę ci tam pomóc, ponieważ nie mam dostępu do MFC.

Jeśli przejdziesz do trasy manifestu, powinna ona wyglądać mniej więcej tak samo jak nazwa aplikacji, ale z rozszerzeniem ".manifest" po rozszerzeniu .exe, np. 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> 

Dla #pragma, patrz poniższy kod.

Aby uzyskać więcej informacji na temat korzystania v6 wspólne kontrole zobaczyć ten link (czyli tam, gdzie mam powyższej informacji z): http://msdn.microsoft.com/en-us/library/bb773175%28v=vs.85%29.aspx

Mała win32 przykład, który korzysta z dyrektywy pragma włączyć Common Controls v6 i wyświetla elewację ikona:

#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

Próbowałem tego, ale nie pokazałem ikony tarczy na przycisku. Czy możesz podać mi przykładowy szablon kodu? Dzięki –

+0

@Ali Ahmed: Dodałem przykład i więcej wyjaśnień. – tinman

Powiązane problemy