防止控制台窗口终止进程

问题描述 投票:0回答:1

我正在向 Small Visual Basic 语言(用 VB .NET 编写)添加调试功能,该语言是我在 MS Small Basic(用 C# 编写)之上构建的。 我有两个问题:

问题一: SB/sVB TextWindow 代表控制台窗口,当从单独的进程访问它时(例如运行该语言编译的 exe 文件),它可以正常工作,但在调试模式下会出现问题。 TextWindow(控制台)在调试模式下不起作用。它处于非活动状态,用户无法写入其中。 该代码使用 win32 API 来显示控制台,然后使用 System.Console 类方法与其交互。在 WinForms 和 WPF 项目中,这将与输出窗口而不是控制台窗口交互。 这是我尝试读取密钥时遇到的异常: System.InvalidOperationException:“当任一应用程序没有控制台或控制台输入已从文件重定向时,无法读取密钥。

编辑: 我找到了这个问题的解决方案: 我发现当我在 VS .NET 中以调试模式运行 sVB 项目时,控制台窗口不起作用,但是如果我在没有调试的情况下运行它,或者在 VS .NET 之外启动 sVB.EXE,控制台窗口就会起作用,并且这个我觉得很好。 所以,问题1已经解决了,但问题2还需要解决。

问题2: 控制台窗口关闭时会终止整个过程,我找不到阻止这种情况的方法。我在这里读过类似的主题,但找不到合适的解决方案。例如,禁用关闭按钮并不是完整的解决方案,因为用户仍然可以按 Ctrl+C。我还尝试使用 SetConsoleCtrlHandler 来拦截关闭事件,但我无法取消终止进程。 请注意,在调试模式下运行时关闭进程会关闭 sVB 本身!运行任何 app.exe 时这也是一个问题,因为在其他窗口打开时关闭控制台将关闭所有窗口!

这些问题有解决办法吗? 如果没有,我可以为 TextWindow 使用普通窗口吗?如果可以,如何使代码执行等待 Read 方法的返回,直到用户在这样的窗口中提交输入? 谢谢。

c# vb.net console smallbasic
1个回答
0
投票

我找到了第一个问题的解决方案: 我发现当我在 VS .NET 中以调试模式运行 sVB 项目时,控制台窗口不起作用,但是如果我在没有调试的情况下运行它,或者在 VS .NET 之外启动 sVB.EXE,控制台窗口就会起作用,并且这个我觉得很好。 所以,问题1已经解决了。

关于问题2: 现在。我只是禁用了控制台窗口的关闭按钮,如here所述,因此,用户必须按任意键才能关闭窗口,但代码实际上会隐藏它,除非它是项目中最后打开的窗口。这是一个很好的解决方法,但用户仍然可以按 Ctrl+C 关闭窗口。事实上,这对于使用 sVB 的儿童和成人来说不太可能,所以,我对此感到满意,并将其标记为解决方案,直到有人提出更好的解决方案。 谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.