【问题标题】:ShellExecuteEx with SEE_MASK_FLAG_NO_UI displays message anyway带有 SEE_MASK_FLAG_NO_UI 的 ShellExecuteEx 仍然显示消息
【发布时间】:2019-03-08 13:44:16
【问题描述】:

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

现在当我运行这个简短的 sn-p 时,会显示与上面相同的对话框,即使我将 SEE_MASK_FLAG_NO_UI 标志放在 sei.fMask 中:

  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 的相同代码将打开它 按预期使用记事本。

documentation 假装不应该与SEE_MASK_FLAG_NO_UI 一起显示错误消息。

那我该怎么办,ShellExecuteEx 不会弹出任何消息,而是返回错误代码?

我只在 Windows 10 上检查过这个,我不知道旧 Windows 版本的行为是什么。

【问题讨论】:

  • 我猜这不是错误对话框吧。这是一个允许用户形成关联的对话框,以便 shell 可以尝试调用动词。
  • @DavidHeffernan,确切地说,这不是错误消息。无论如何,我不希望显示任何 UI。也许我应该简单地检查注册表中 HKEY_CLASSES_ROOT 下是否存在“.xyz”键,如果不存在,则将ShellExecuteEx alltogether 短路。

标签: windows winapi windows-10 shellexecuteex


【解决方案1】:

在调用 ShellExecute() 之前使用 FindExecutable()AssocQueryString()。这允许检查关联是否存在。 SEE_MASK_FLAG_NO_UI 防止错误显示,但是这种情况不被视为错误。

【讨论】:

  • 这不是 100% 可靠的,即使这些函数说不,仍然可能有一个外壳扩展 .DLL 来处理您执行文件类型时的默认操作。
  • 你在哪里找到的?
  • Shell 扩展 .DLL 可以动态决定它们是否是默认操作,如果不实际执行它们的代码就无法知道。
  • @Michael Anders 是对的。我已经写了一个外壳扩展来做到这一点。它动态接管默认操作。如果正在执行的文件有特定的头文件,则执行我的应用程序,否则将执行正常的默认应用程序。有关在 Shell 扩展注册中使用 MayChangeDefaultMenu 注册表设置的信息,请参阅 Registering a Shortcut Menu Handler with a Dynamic Verb
  • 好的,在这种情况下你什么也做不了。我提供的函数可能会返回假阴性,但绝不会出现假阳性,因此他永远不会得到一个讨厌的“打开方式”窗口。
猜你喜欢
  • 2012-07-20
  • 2019-10-21
  • 2019-01-22
  • 1970-01-01
  • 2013-03-29
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多