2011-08-23 4 views
5

Windows 7에서 Visual Studio 2008을 사용하여 MFC에서 응용 프로그램을 만들고 있습니다. 응용 프로그램이 시작되고 관리 액세스가 필요한 서비스가 중지됩니다. 응용 프로그램이 시작되면 관리 액세스 권한이 없습니다. 하지만 서비스 시작 버튼을 클릭하면 관리 액세스 권한이 부여되고 작업이 수행됩니다. 관리 액세스 권한이 필요한 버튼에 관리 아이콘을 설정하는 방법은 궁금합니다. Flags를 설정해야합니까? 감사합니다.MFC 대화 상자에서 관리자 권한 아이콘을 설정하는 방법은 무엇입니까?

답변

6

Windows Vista에서는 새 플래그 중 하나를 사용하여 단추에 방패 아이콘을 추가 할 수 있습니다. 이처럼 사용할 수있는, 그것을 가능하게하는 매크로가있다 : 매크로에 대한

Button_SetElevationRequiredState(hwnd, TRUE); 

문서는 http://msdn.microsoft.com/en-us/library/bb761865%28VS.85%29.aspx

에서 많은 UAC 관련 작업을 수행하는 방법에 대한 개요 http://msdn.microsoft.com/en-us/library/bb756990.aspx#BKMK_ShieldButton를 참조한다.

아마도 CButton :: SetElevationRequired()도 같은 일을하지만 사용자의 MFC 프로젝트에 더 잘 맞는 것입니다. 당신은 또한 당신이 중 하나 또는의 항목 우유없는 (매니페스트 파일을 사용 할 수있는 일반 컨트롤 V6 DLL의 사용을 활성화해야

ctl->SetElevationRequired(TRUE); 

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

를 참조하십시오 :이처럼 사용할 수 리소스 파일을 임베드 할 수 있습니다.) 또는 MSVC2005 이상의 코드에서 #pragma 지시문을 사용하십시오. MFC에 액세스 할 수 없기 때문에 이미 수정할 수있는 매니페스트가있는 MFC 응용 프로그램이있을 수 있지만 수정할 수는 없습니다.

매니페스트 경로를 찾으려면 애플리케이션 이름과 같지만 .exe 뒤에 ".manifest"가 있어야합니다. 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의 경우 아래 코드를 참조하십시오. http://msdn.microsoft.com/en-us/library/bb773175%28v=vs.85%29.aspx

공통 제어 V6를 활성화 프라그 지시자를 사용하고 고도를 표시하는 작은 Win32에서 예 : 공통 컨트롤 (I부터 상기 정보를 가지고 곳인)이 링크가 표시 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; 
} 
+0

나는 이것을 시도했지만 버튼에 방패 아이콘을 표시하지 않았습니다. 샘플 코드 템플릿을 제공해 주실 수 있습니까? 감사합니다 –

+0

@Ali Ahmed : 예와 더 자세한 설명을 추가했습니다. – tinman

관련 문제