如何在MFC对话框按钮上设置管理权限图标
How to set Administrative right Icon on MFC Dialog Button?
我在windows 7中使用Visual Studio 2008创建一个MFC应用程序。我的应用程序启动和停止需要管理访问的服务。当应用程序启动时,它没有管理权限。但是当我点击启动服务按钮时,它获得了管理权限并执行了操作。我想知道如何在按钮上设置管理图标,其操作需要管理访问?我需要设置一些flag吗?由于
在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项目。你可以这样使用:
ctl->SetElevationRequired(TRUE);
见http://msdn.microsoft.com/en-us/library/bb386824%28v=VS.90%29.aspx
您还需要启用通用控件v6 DLL的使用,您可以使用清单文件(在资源文件中有或没有嵌入它的条目)或在MSVC2005或更高版本的代码中使用#pragma指令。对于MFC应用程序,您可能已经有一个可以修改的清单,但是我无法在那里帮助您,因为我没有访问MFC的权限。
如果你选择manifest路径,它应该看起来像这样,并且与你的应用程序具有相同的名称,但带有"。.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,请参见下面的代码。
有关使用v6通用控件的更多信息,请参阅此链接(这是我获得上述信息的地方):http://msdn.microsoft.com/en-us/library/bb773175%28v=vs.85%29.aspx
一个win32的小例子,它使用pragma指令来启用通用控件v6并显示elevation图标:
#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;
}
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 当vector是tje全局变量时,c++中vector的内存管理
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- C++ 中的 CSV 文件管理(特别是设置标头和每个标头将分别具有的值)
- C++从 Java 角度设置和映射内存管理
- 在没有"线程管理"的情况下C++设置并发哈希表/哈希?
- 如何设置MQ以允许三个服务使用MQ资源管理器相互通信
- Eclipse 找不到头文件管理器,即使已设置包含路径
- 堆管理系统的unordered_map.是否可以进行无碰撞设置
- 为什么将场景管理器设置为场景节点的父级会在Irrlicht中引发错误
- 在设置断点的Windows上进行分配、释放和内存管理
- 如何在MFC对话框按钮上设置管理权限图标