2011-08-23 5 views
5

Windows 7でVisual Studio 2008を使用してMFCでアプリケーションを作成しています。私のアプリケーションは管理アクセスを必要とするサービスを開始して停止します。アプリケーションが起動すると、管理者権限がありません。しかし、私はサービスを開始ボタンをクリックすると、管理アクセスを取得し、アクションを実行します。管理アクセスを必要とするアクションのボタンに管理アイコンを設定する方法は不思議です。 Flagsを設定する必要はありますか? ありがとうMFCダイアログボックスの管理権限アイコンの設定方法は?

答えて

6

Windows Vistaでは、新しいフラグの1つを使用してボタンにシールドアイコンを追加できます。あなたはこのように使用することができ、それを有効にするには、マクロは、あります:マクロの

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プロジェクトに沿ったものになります。また、あなたは行うのいずれかまたはのエントリwitout(マニフェストファイルを使用してできる一般的なコントロール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

関連する問題