Delphi定制Windows应用程序清单文件Application Manifest
默认应用程序清单文件
当在Windows目标平台构建项目时,RAD Studio会自动包含应用程序清单文件。您可以用默认的应用程序清单文件为基础,用作自定义应用程序清单文件。应用程序清单文件包含XML应用程序的依赖项列表。例如,这是默认RAD Studio提供的清单文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" publicKeyToken="6595b64144ccf1df" language="*" processorArchitecture="*"/> </dependentAssembly> </dependency> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo> </assembly>
应用程序清单文件提供信息,例如:
- Windows公共控件支持:需要使用最新版本的视觉控件(也称为“XP主题”)。
- 需要的应用程序提升级别:指定应用程序是否需要以管理员权限运行。
- DPI感知:指定应用程序是否被设计成基于不同的DPI值来处理缩放。
创建自定义应用程序清单文件
- 1、创建一个空白文本文件。
- 2、将默认的应用程序清单复制到其中。
- 3、添加或修改依赖项(如所需的提升级别或DPI支持)。
- 4、以.manifest扩展名保存文本。
声明所需的提高级别
默认的应用程序清单声明的级别为asInvoker。这意味着应用程序将具有与父进程相同的提升级别。如果您希望将应用程序提升到Windows管理员权限级别,只需改变requestedExecutionLevel标签中的值,把asInvoker改为requireAdministrator。
注意:用户仍然需要管理员权限才能运行具有管理员特权级别的应用程序。
声明DPI感知
为了创建一个DPI感知的应用程序,您需要在应用程序清单中声明DPI感知。例如,为了声明您的应用程序是每个监视器DPI感知的,在之前添加以下内容:
<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <dpiAware>True/PM</dpiAware> </asmv3:windowsSettings> </asmv3:application>
将自定义清单文件添加到应用程序中
- 1、转到Project > Options > Application 打开Application Options页面;
- 2、从Target选择目标平台;
- 3、在Manifest File区域,从下拉菜单将Auto Generate选为Custom;
- 4、在Custom manifest区域,点击省略号按钮[...],选择自定义清单文件.manifest。
注意:应用程序选项对于每个平台配置是特定的。您需要为每个平台配置对显式设置自定义清单(它可能是相同的.manifest文件)。
故障排除
测试管理员权限
下面的代码片段可以作为应用程序是否需要(并且适当地授予)管理员权限的快速测试。申报你的申请所需的提升级别,并执行以下程序:
管理员级别(标准用户下):
- 1、asInvoker:应用程序作为标准用户启动
- 2、highestAvailable:应用程序作为标准用户启动
- 3、requireAdministrator:在运行应用程序之前提示管理员权限
uses System.Win.Registry, Winapi.Windows; procedure isAdmin(); var reg: TRegistry; openResult: Boolean; begin reg := TRegistry.Create(KEY_READ); reg.RootKey := HKEY_LOCAL_MACHINE; reg.Access := KEY_WRITE; openResult := reg.OpenKey('Software\MyCompanyName\MyApplication\',True); if not openResult = True then begin MessageDlg('无法写入注册表。您的应用程序没有管理员级权限。', TMsgDlgType.mtError, mbOKCancel, 0); end else begin MessageDlg('允许写入注册表。您的应用程序具有管理员级权限。', TMsgDlgType.mtInformation, mbOKCancel, 0); end; reg.CloseKey(); reg.Free; end;
此测试之所以有效,是因为您需要管理员级权限才能写入注册表的HKEY_LOCAL_MACHINE\Software部分。代码段实际上不向注册表写入任何东西,它只请求写入权限。
确保您构建应用程序后,在IDE之外执行它,因为IDE默认情况下会用管理员级别的权限调试应用程序(不尊重应用程序清单)。