簡體   English   中英

如何啟動一個進程並使其主窗口模態到啟動進程的窗口?

[英]How to start a Process and make its main window modal to the starting process's window?

我有一個C#WinForms程序,它啟動另一個進程。 程序然后等待,直到過程完成。

目前我使用Process.WaitForExit(),但這意味着當我的程序等待進程結束時,它不會重新繪制並“看起來”它沒有響應。

我的程序啟動的進程窗口是否有任何方式,對我的主窗體是模態的(即你不能切換回我的程序和窗口重繪)?

基本上我想做一些像Form.ShowDialog(),除了使用Process的窗口作為窗體顯示為對話框。

為什么不在單獨的線程中啟動進程? 這樣,只有你的線程會等待。 這樣,您的表單仍會響應。

您無法阻止用戶切換回來,因為您已經生成了一個單獨的進程。 就操作系統而言,就像你通過它的桌面圖標(例如)開始第二個操作系統一樣。

我認為您可以期望的最好的方法是在第二個進程處於活動狀態時禁用相關的菜單/選項。 您需要繼續輪詢以查看它是否仍然存在,否則您的主應用程序將無法使用。

另一種方法可能是最小化主要應用程序,這將使其不受影響。

據我所知,這是不可能的。 您可以使用SetParent(非托管)來設置子/父關系,但這是您可以去的地方。 注意:我正在使用基於perl的程序,並且SetParent()例程似乎不像宣傳的那樣工作。

創建表單,顯示模態。 然后使用BackgroundWorker啟動進程並處理RunWorkerCompleted事件以關閉表單。

你可以創建另一個你制作模態的表格。 在該表單加載上,您將調用Visible = false; 然后你會啟動一個線程來啟動你的進程並等待它通過線程完成。

然后執行BeginInvoke(new MethodInvoker(delegate { Close(); } )); 等待完成后從線程內部開始。

您應該明確地創建一個新線程,並從該線程啟動您嘗試啟動的應用程序。 這將使您的應用程序響應,即使其他應用程序正在運行

  1. 使用process.Exited事件來了解應用程序何時退出。
  2. 在您的表單中勾選Activated(認為它是正確的名稱)事件。 使用它來關注其他應用程序。

另一種方式是有點不標准,但它的工作原理。 定義變量ProcessActive。 在應用程序中可見的每個控件上,檢查變量,如果設置,則不處理控件事件。 在啟動流程之前,將ProcessActive變量設置為True並使用事件啟動流程。 在流程上定義Exited事件,以便將ProcessActive設置為False。 他們可以切換回啟動應用程序,一切看起來都不錯。 在該過程退出之前,它不會做任何事情。 您可能希望將光標設置為沙漏,以便他們知道應用程序正忙。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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