簡體   English   中英

阻止用戶關閉通過C#程序打開的應用程序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM