ShellExecuteEx使用SEE_MASK_FLAG_NO_UI标志仍会显示消息

3

在我的系统中,.xyz扩展名根本没有注册。所以当我在资源管理器中双击一个.xyz文件时,Windows 10会弹出标准的“如何打开此文件”对话框,这是预期的。

现在,当我运行这个短代码片段时,即使我在sei.fMask中放置了SEE_MASK_FLAG_NO_UI标志,仍会显示与上面相同的对话框:

  SHELLEXECUTEINFO sei = { 0 };
  sei.cbSize = sizeof(SHELLEXECUTEINFO) ;
  sei.fMask = SEE_MASK_FLAG_NO_UI;
  sei.hwnd = AfxGetMainWnd()->GetSafeHwnd();
  sei.lpVerb = _T("open");
  sei.lpFile = _T("C:\\Users\\Test\\Documents\\temp\\Temp.xyz");
  sei.lpParameters = NULL;
  sei.lpDirectory = appdir;
  sei.nShow = SW_SHOW;
  ShellExecuteEx(&sei); 
  • 文件 "C:\\Users\\Test\\Documents\\temp\\Temp.xyz" 存在。

  • sei.lpFile 指向现有的 .txt 文件,与预期一样使用记事本打开。

文档 表示使用 SEE_MASK_FLAG_NO_UI 不应显示任何错误消息。

那么我该怎么做才能使 ShellExecuteEx 不弹出任何消息而返回错误代码呢?

我只在 Windows 10 上进行了测试,不知道旧版 Windows 的行为如何。


我猜那不是一个错误对话框,而是一个对话框,让用户可以形成关联,以便壳体可以尝试调用该动词。 - David Heffernan
@DavidHeffernan,确切地说,这不是错误消息。无论如何,我不想显示任何UI界面。也许我应该简单地检查在HKEY_CLASSES_ROOT下注册表中是否存在“.xyz”键,如果不存在,就直接终止ShellExecuteEx - Jabberwocky
1个回答

2
使用FindExecutable()AssocQueryString()在调用ShellExecute()之前,这可以检查关联是否存在。使用SEE_MASK_FLAG_NO_UI可以防止错误显示,但是这种情况不被视为错误。"最初的回答"

2
这并非百分之百可靠,即使函数表明不存在,仍然可能存在处理执行文件类型默认操作的 Shell 扩展 .DLL。 - Anders
你从哪里找到的? - Michael Chourdakis
1
Shell扩展.DLL可以动态决定它们是否是默认操作,没有办法在不实际执行其代码的情况下知道。 - Anders
1
@Michael Anders是正确的。我编写了一个Shell扩展,可以完全实现这一点。它动态地接管默认操作。如果要执行的文件具有特定的头,则会执行我的应用程序,否则将执行正常的默认应用程序。请参阅使用动态动词注册快捷菜单处理程序,了解在Shell扩展的注册中使用MayChangeDefaultMenu注册表设置的方法。 - Remy Lebeau
1
好的,既然这样你就无能为力了。我提供的函数可能会返回错误的负面结果,但永远不会出现错误的正面结果,所以他永远不会看到令人讨厌的“打开方式”窗口。 - Michael Chourdakis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接