如何从UWP应用启动CMD.exe执行命令行打开打印首选项UI
UWP两项开发需求实现方案
UWP默认运行在AppContainer沙箱环境下,默认权限无法直接拉起桌面端可执行文件,两个需求都需要依托全信任进程能力实现,具体方案如下:
1. 应用内启动CMD.exe
- 前置配置:项目目标版本需不低于Windows 10 1809(10.0.17763),右键打开
Package.appxmanifest代码视图,先在Package根节点添加桌面扩展命名空间,再配置全信任进程扩展指向CMD路径,核心配置片段如下:
<Package ... xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10" IgnorableNamespaces="uap mp desktop"> ... <Applications> <Application ...> <Extensions> <desktop:Extension Category="windows.fullTrustProcess" Executable="C:\Windows\System32\cmd.exe" /> </Extensions> </Application> </Applications> </Package>
- 调用逻辑:在需要触发启动的业务代码中,直接调用官方提供的全信任进程启动API即可:
using Windows.ApplicationModel; // 无参数启动CMD await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync(); // 带参数启动CMD,例如执行指定命令后自动关闭 string cmdArgs = "/c ipconfig"; await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync(cmdArgs);
- 注意事项:如果UWP项目编译目标为x86架构,访问64位系统System32目录下的CMD会被系统自动重定向到SysWOW64路径下的32位CMD,需要将路径替换为
C:\Windows\Sysnative\cmd.exe绕过重定向。
2. 唤起打印首选项UI
该能力可以直接复用上述全信任进程的命令行传参能力实现,不需要额外配置新能力:
- 系统原生提供了通过命令行唤起指定打印机首选项UI的入口,对应命令为
rundll32 printui.dll,PrintUIEntry /e /n "目标打印机全称",只需要把该命令作为参数传给CMD启动即可。 - 调用示例代码:
// 替换为你要唤起首选项的打印机名称 string targetPrinterName = "Microsoft Print to PDF"; string cmdArgs = $"/c rundll32 printui.dll,PrintUIEntry /e /n \"{targetPrinterName}\""; await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync(cmdArgs);
- 可选优化方案:如果需要更稳定的调用、拿到UI关闭后的回调,可以单独开发一个轻量Win32控制台程序作为全信任代理,UWP把打印机名称通过应用服务或者命令行参数传给代理程序,由代理程序调用
DocumentPropertiesWin32 API唤起打印首选项UI,避免直接调用CMD带来的命令行转义、黑窗闪烁问题。
注意事项:
- 配置了
windows.fullTrustProcess能力的应用如果要上架Microsoft Store,需要提前提交受限能力使用申请,企业内部侧载部署的应用无此限制。- 沙箱会直接拦截
Process.Start这类传统桌面端进程启动API,不要尝试直接用该方法启动CMD或其他EXE,会抛出权限不足异常。- 唤起打印首选项前建议先通过UWP自带的
PrintManagerAPI枚举系统已安装打印机列表,校验目标打印机存在后再调用,避免命令执行无响应。
内容的提问来源于stack exchange,提问作者Samyraj
相关产品推荐
相关产品推荐

