2010-07-24 78 views
5

我有一个基于命令行的旧程序(它的Fortran,如果有要求的话)在用户单击按钮时从C#应用程序打开。如果命令行程序在运行时关闭,则数据将被损坏。有没有办法阻止人们在运行时关闭它?像使[x]不可用或以某种方式将程序嵌入到我的程序中?防止用户关闭通过C#程序打开的应用程序

System.Diagnostics.Process pname = 
System.Diagnostics.Process.Start(Path.Combine(Application.StartUpPath, 
"diag_main.exe")); 

    pname.Exited += new EventHandler(pname_Exited); 

注:我想还是能够看到应用程序运行,当它完成它自身的关闭,我不能让人们杀死它,而它在运行过程中。

+0

你是怎么开始的?你能发布代码吗? – Oded 2010-07-24 20:44:37

回答

2

一个解决方案,将采取节目,像样的数目,但可以做到:

写一个单独的程序拦截程序的屏幕输出,并以某种方式发送到您的程序。在隐藏窗口中运行该程序,它将转向并运行应用程序并将输出发送到您的程序。

至少有部分拦截器几乎肯定要装配。

编辑:重定向标准输出不会执行它,即使程序只写入它 - 他希望输出显示。

有可能需要被截获三两件事:

诠释21H文件系统写入。这些是可以通过重定向stdout拦截的东西。请注意,某些程序可能会写入一个不同的句柄编号,该编号实际上代表stdout文件 - 在程序的句柄表中查找正在写入的句柄,并将其与stdout条目(IIRC第二条目)进行比较 - 如果它们匹配它实际上是屏幕输出。

第二级是IIRC int 10h。有几个子呼叫必须被拦截。

最后,一个程序可能会做直接的屏幕写入。拦截这些将是一个主要痛苦,我甚至不会考虑尝试它(你将不得不基本上重写DOS盒)。相反,经常比较屏幕内存与保存的副本寻找变化。

在这三种情况下,至少部分程序将不得不用汇编语言编写。

我已经做了第一个,第二个玩了一下,但后来我发现我可以不做。我从来没有尝试过第三次。

+1

为什么他不能只重定向过程中的标准输出? – tster 2010-07-24 21:23:40

+0

+1我认为这是最好的方法。我并不认为这需要非常多的工作,我知道System.Diagnostics.Process类具有重定向标准输入和输出的属性。然后,他可以将他的应用程序嵌入到某种WPF或WinForms应用程序中,然后确保用户不能杀死主机应用程序。 – Pandincus 2010-07-24 21:30:39

+0

+1重定向stdio在.NET中并不困难。它不适用于直接写入控制台的程序,但那些程序很少。 – 2010-07-24 21:47:43

1

不幸的是,没有。如果其他程序具有UI,则无法将其从用户隐藏。如果没有,那么您可以通过使用ProcessStartInfo类而不显示控制台窗口来启动它。尽管如此,他们仍然可以使用任务管理器来杀死它。

0

如果程序正在加载一个cmd窗口,那么不,无法阻止用户关闭窗口。更好的方法是在后台启动该程序,并将其隐藏于临时用户中。恶意用户仍然可以找到该进程并将其杀死,但这可能不是什么问题。

您可以用下面这样做:

var psi = new ProcessStartInfo(); 
psi.CreateNoWindow = true; 
/// etc. 
1

我不知道这是否会应用到您的应用程序,但你可以用一个隐藏的窗口中启动的过程 - 这将意味着该应用程序是隐藏,不能通过用户界面停止。

构建过程对象时,请使用构造函数重载,该过载需要一个ProcessStartInfo对象。这给ProcessWindowStyle.HiddenWindowStyle属性和CreateNoWindow属性设置为true

ProcessStartInfo startInfo = new ProcessStartInfo("fortranApp.exe"); 
startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
startInfo.CreateNoWindow = true; 

Process.Start(startInfo); 

当然,它仍然会出现在进程列表,并可以杀死这种方式,但至少这将防止任何无意关闭。

+0

我希望能够通过 – Pieces 2010-07-24 20:52:36

+0

@Pieces查看应用程序 - 您可以始终将其最小化。除此之外,如果应用程序本身不支持它,我现在没有办法启动一个进程并禁用窗口控制按钮。 – Oded 2010-07-24 21:00:11

+0

是否可以启动隐藏进程,将某些内容附加到stdout以收集由Fortran程序生成的消息并将其传递到C#程序的显示窗口? – 2010-07-24 23:07:52

相关问题