首页 > 解决方案 > 如何不显示 UI?

问题描述

此链接上的MSDN声明有一个标志

CMIC_MASK_FLAG_NO_UI

The system is prevented from displaying user interface elements (for example, error messages) while carrying out a command.

然而,这也表明该结构具有

nShow

Type: int

A set of SW_ values to pass to the ShowWindow function if the command displays a window or starts an application.

我认为这相互矛盾,因为没有迹象表明我可以将后一个参数设置为 0 并且ShowWindow文档中没有 SW_NOSHOW 参数。

甚至有可能抑制那个窗口吗?如果是 - 如何?

蒂亚!!

标签: windowsapi

解决方案


关于我们在这里讨论的 UI 存在一些歧义。

有一些与调用命令相关的 UI 内容(询问网络共享密码、失败时的错误消息等),CMIC_MASK_FLAG_NO_UI当然也适用于这里。我不知道有多大的相关nShow性。调用者不知道可能会显示哪个 UI,并且被调用者允许其错误MessageBox最大化等是零意义的。尊重SW_HIDE可能最终会卡住等待用户与他们看不到的窗口进行交互。

另一个 UI 实际上是被执行的东西。在启动新进程的情况下,我们正在查看ShellExecuteEx调用。CMIC_MASK_FLAG_NO_UI作为(相同的整数值)传递SEE_MASK_FLAG_NO_UI,MSDN 只是为此标志说“如果发生错误,请不要显示错误消息框”。然而,这里nShow是相关的,可以一直渗透到CreateProcess.

这是我个人处理这种情况的方式:

  • 设置CMIC_MASK_FLAG_NO_UI是否要在出现故障时显示自己的错误 UI,或者如果您在静默/自动执行模式下运行。
  • 仅在您控制正在执行的操作时设置nShow为其他值。SW_SHOW例如,您知道 cmd.exe 正在被调用,您需要使用SW_HIDE.

重要的是要记住,它CMINVOKECOMMANDINFO是由各种 shell 对象(文件、控制面板等)的默认IContextMenushell32 实现和第 3 方上下文菜单处理程序解析的。你不能假设他们会尊重你的意愿。


推荐阅读