如何防止 "How do you want to open this file" 对话框?
How to prevent "How do you want to open this file" dialog?
在我的应用程序中,我使用 HTML 文件打开一个报告:
//pStrPath is file:///C:/Users/appts/AppData/Local/Temp/Report_View.htm
ShellExecute(hParentWnd, L"", pStrPath, NULL, NULL, SW_SHOW);
在我的开发机器上,它在 Web 浏览器中打开,但是当我刚刚在 Windows 10 的新安装上测试它时,它显示了这个对话框:
那么我怎样才能阻止它显示并从一开始就使用 "keep using this app" 选项呢?否则我的用户可能会很困惑。
PS。请注意,Edge 已安装并且可以打开 .htm
个文件,如果我双击它们。
参考 Launching Applications (ShellExecute, ShellExecuteEx, SHELLEXECUTEINFO) 我们注意到文本
宾语动词
对象可用的动词本质上是您在对象的快捷菜单上找到的项目。要查找可用的动词,请查看 HKEY_CLASSES_ROOT\CLSID{object_clsid}\[=23 下的注册表=]Shell\verb
常用动词包括:
- edit - 启动编辑器并打开文档进行编辑。
- find - 从指定目录开始搜索。
- open - 启动应用程序。如果此文件不是可执行文件
文件,其关联的应用程序将启动。
- print - 打印文档文件。
- properties - 显示对象的属性。
鉴于双击 通常等同于在对象的快捷菜单中选择 "open",如果我们为函数提供 open 动词,我们可以预期该行为反映了用户双击的行为。 - 请参阅下面 Ken 的评论
因此,我们可以预期以下代码可以达到预期的效果。
//pStrPath is file:///C:/Users/appts/AppData/Local/Temp/Report_View.htm
ShellExecute(hParentWnd, L"open", pStrPath, NULL, NULL, SW_SHOW);
如果您尝试在 64 位 Windows 中从 32 位程序打开默认程序,ShellExecute 和 ShellExecuteEX 可能会显示“您希望如何打开此文件?”每次的对话框。我认为这是由于默认程序在 Windows 中注册自身的方式所致。
我可以在 Windows 11 全新安装中重现此错误,其中照片设置为 .jpg 文件的默认程序。
就我而言,我发现如果我使用 ShellExecuteExW 函数并将扩展名传递到 SHELLEXECUTEINFOW 类型的 .lpClass 中,它就可以工作。
它也应该与 ShellExecuteExA 函数一起工作
确保它不是您要打开的 exe、reg、bat 文件或 URL。它必须是文档类型的文件。
使用 .lpClass 传递扩展名,如“.jpg”
将 SEE_MASK_CLASSNAME As Long = &H1 添加到您传入的 .fMask 参数中,例如 .fMask = YourMaskValue 或 SEE_MASK_CLASSNAME
我认为这可行的原因是它绕过了任何重定向并直接从 HKEY_CLASSES_ROOT.jpg
读取
在我的应用程序中,我使用 HTML 文件打开一个报告:
//pStrPath is file:///C:/Users/appts/AppData/Local/Temp/Report_View.htm
ShellExecute(hParentWnd, L"", pStrPath, NULL, NULL, SW_SHOW);
在我的开发机器上,它在 Web 浏览器中打开,但是当我刚刚在 Windows 10 的新安装上测试它时,它显示了这个对话框:
那么我怎样才能阻止它显示并从一开始就使用 "keep using this app" 选项呢?否则我的用户可能会很困惑。
PS。请注意,Edge 已安装并且可以打开 .htm
个文件,如果我双击它们。
参考 Launching Applications (ShellExecute, ShellExecuteEx, SHELLEXECUTEINFO) 我们注意到文本
宾语动词
对象可用的动词本质上是您在对象的快捷菜单上找到的项目。要查找可用的动词,请查看 HKEY_CLASSES_ROOT\CLSID{object_clsid}\[=23 下的注册表=]Shell\verb
常用动词包括:
- edit - 启动编辑器并打开文档进行编辑。
- find - 从指定目录开始搜索。
- open - 启动应用程序。如果此文件不是可执行文件 文件,其关联的应用程序将启动。
- print - 打印文档文件。
- properties - 显示对象的属性。
鉴于双击 通常等同于在对象的快捷菜单中选择 "open",如果我们为函数提供 open 动词,我们可以预期该行为反映了用户双击的行为。 - 请参阅下面 Ken 的评论
因此,我们可以预期以下代码可以达到预期的效果。
//pStrPath is file:///C:/Users/appts/AppData/Local/Temp/Report_View.htm
ShellExecute(hParentWnd, L"open", pStrPath, NULL, NULL, SW_SHOW);
如果您尝试在 64 位 Windows 中从 32 位程序打开默认程序,ShellExecute 和 ShellExecuteEX 可能会显示“您希望如何打开此文件?”每次的对话框。我认为这是由于默认程序在 Windows 中注册自身的方式所致。
我可以在 Windows 11 全新安装中重现此错误,其中照片设置为 .jpg 文件的默认程序。
就我而言,我发现如果我使用 ShellExecuteExW 函数并将扩展名传递到 SHELLEXECUTEINFOW 类型的 .lpClass 中,它就可以工作。 它也应该与 ShellExecuteExA 函数一起工作
确保它不是您要打开的 exe、reg、bat 文件或 URL。它必须是文档类型的文件。
使用 .lpClass 传递扩展名,如“.jpg”
将 SEE_MASK_CLASSNAME As Long = &H1 添加到您传入的 .fMask 参数中,例如 .fMask = YourMaskValue 或 SEE_MASK_CLASSNAME
我认为这可行的原因是它绕过了任何重定向并直接从 HKEY_CLASSES_ROOT.jpg
读取