2010-07-24 118 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

相關問題