[英]Prevent a user from closing an application that is opened through a C# program
我有一個舊的基於命令行的程序(如果重要的話,它的fortran)是在用戶單擊按鈕時從C#應用程序打開的。 如果命令行程序在運行時關閉,則數據會損壞。 有沒有辦法阻止人們在運行時關閉它? 就像讓[x]不可用或以某種方式將程序嵌入我的程序?
System.Diagnostics.Process pname =
System.Diagnostics.Process.Start(Path.Combine(Application.StartUpPath,
"diag_main.exe"));
pname.Exited += new EventHandler(pname_Exited);
注意:我希望仍然可以看到應用程序正在運行,並且它在完成時自行關閉,我只是不能讓人們在運行過程中將其殺死。
一個解決方案,需要大量的編程但可以完成:
編寫一個單獨的程序,攔截程序的屏幕輸出並以某種方式將其發送到您的程序。 在隱藏窗口中運行此程序,它會轉向並運行應用程序並將輸出發送到您的程序。
攔截器的至少部分幾乎肯定必須在組裝中。
編輯:即使程序只寫入它,重定向標准輸出也不會這樣做 - 他希望顯示輸出。
有三件事可能需要截獲:
Int 21h文件系統寫入。 這些是可以通過重定向stdout來截獲的東西。 請注意,某些程序可能會寫入實際代表stdout文件的不同句柄號 - 在程序的句柄表中查找正在寫入的句柄,並將其與stdout條目(第二個條目的IIRC)進行比較 - 如果它們匹配它實際上是屏幕輸出。
第二級是IIRC,10h。 必須攔截幾個子呼叫。
最后,程序可以直接進行屏幕寫入。 攔截這些將是一個主要的痛苦,我甚至不會考慮嘗試它(你必須基本上重寫dos框。)而是經常將屏幕內存與保存的副本進行比較以尋找更改。
在所有三種情況下,至少部分例程將必須在匯編中編寫。
我已經完成了第一次,與第二次玩了一會兒然后我發現我可以順利完成它。 我從未嘗試過第三次。
很不幸的是,不行。 如果其他程序具有UI,則無法將其從用戶隱藏。 如果沒有,則可以使用ProcessStartInfo
類在不顯示控制台窗口的情況下啟動它。 即使你這樣做,他們仍然可以使用任務管理器殺死它。
我不知道這是否適用於您的應用程序,但您可以使用隱藏窗口啟動該過程 - 這將意味着應用程序被隱藏,無法通過UI停止。
構造過程對象時,請使用帶有ProcessStartInfo
對象的構造函數重載。 將此WindowStyle
屬性設置為ProcessWindowStyle.Hidden
,將CreateNoWindow
屬性設置為true
:
ProcessStartInfo startInfo = new ProcessStartInfo("fortranApp.exe");
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.CreateNoWindow = true;
Process.Start(startInfo);
當然,它仍然會出現在進程列表中並且可以被殺死,但至少這會阻止任何意外關閉。
如果程序是在cmd
窗口中加載,那么不,沒有辦法阻止用戶關閉窗口。 一種更好的方法是在后台啟動該程序,這對於臨時用戶來說是隱藏的。 惡意用戶仍然可以找到該進程並將其終止,但這可能不是一個問題。
您可以使用以下內容執行此操作:
var psi = new ProcessStartInfo();
psi.CreateNoWindow = true;
/// etc.
您可以嘗試使用ProcessStartInfo
並將屬性CreateNoWindow
設置為true,並將WindowStyle
設置為ProcessWindowStyle.Hidden
。 我自己沒試過,但也許你很幸運。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.