简短说明:

从C#以不正确的exe或com文件作为参数启动cmd.exe进程将打开“不受支持的16位应用程序”窗口。
知道如何检测/隐藏此窗口并将错误报告给调用者吗?

更长的解释:

在将服务器应用程序从VMS移植到.NET时,我写了一个VMS / DCL命令解释器,因为我们需要支持DCL命令脚本,并且不允许我们接触支持DCL脚本的业务层。
DCL解释器现在还需要调用本机程序和cmd.exe脚本。

为此,我的DCL解释器支持“ DCL”命令,该命令在隐藏的窗口中启动cmd.exe进程,重定向输入/输出和/或将DCL参数作为脚本传递给cmd.exe。
现在,当传递了错误的脚本文件(例如,扩展名为“ .COM”的DCL命令文件)时,cmd.exe尝试启动文件/程序并启动模式“不支持的16位应用程序”窗口,无论WindowStyle和CreateNoWindow的集合。

当它在服务器上运行时,我需要关闭/抑制该窗口并将错误报告给我的DCL。

我的解决方案:

到目前为止,我唯一能找到的解决方案是检查已启动进程的MainWindowTitle中的“不支持的16位应用程序”,终止该进程并将错误报告回DCL。

但是不幸的是,由于这是在分离过程中运行的,并且DCL不必等待过程结束,因此未定义标题出现的时间,并且检查可能为时过早而失败。

有任何想法吗?

最佳答案

SetErrorMode实际上是解决方案,甚至是记录在案的errorMode。

下面的代码行禁用消息框:

var oldMode = SetErrorMode(ErrorModes.SEM_FAILCRITICALERRORS);


下一行将其设置回原始值:

SetErrorMode(oldMode );

关于c# - C#如何禁止cmd.exe进程中的“不支持的16位应用程序”窗口弹出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42003857/

10-09 13:22