簡體   English   中英

啟動外部應用程序時創建等待 cursor

[英]Create wait cursor when launching external app

這是一個新問題......我已經搜索了互聯網,但顯然我沒有很好地形成這個問題。

我的 winform 程序啟動了一個外部應用程序,我們稱之為“watchit.exe”。 從進程開始到對用戶可見(最終在任務管理器中顯示為任務)需要 watchit 5-15 秒。 我不希望用戶在這段時間內感到沮喪並繼續單擊啟動 watchit 的按鈕,所以我需要等待 cursor 或其他一些指示。

  1. 此表單上有幾個自定義控件,有沒有辦法通過等待 cursor 覆蓋它們的各個光標? 也許將文本放入表單狀態條會比等待 cursor 更好?

  2. 我如何在我的程序中知道 Watchit 何時啟動並運行,以便我可以將 cursor 設置回默認值,或者更改表單狀態條中的文本? 我不想使用計時器來繼續檢查 Watchit 是否已啟動並運行......甚至不知道要檢查什么!

我曾嘗試使用 WMI,但它似乎着眼於進程(或者我可能沒有完全掌握 WMI)。

這是該過程的啟動方式。

Process watchIt = new Process();

string path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
path = Path.Combine(path, "Watchit.exe");
watchIt.StartInfo = new ProcessStartInfo(path, e.ID.ToString());

if (File.Exists(path))
{
    watchIt.Start();  //Starts Watchit, but how do you know when it's 'up' ?
    Cursor.Current = Cursors.WaitCursor;
}

TIA

您可以使用Process.WaitForInputIdle() 方法 直接引用自 MSDN 文檔:

"This state is useful, for example, when your application needs to wait 
for a starting process to finish creating its main window before the 
application communicates with that window."

我通常會建立一個模態對話框,其 cursor 設置為等待 cursor。 你可以讓它像閃屏一樣無邊界。 從它開始總是在頂部,這樣它就不會出現在任何東西后面,但是一旦它完成加載,就將它設置為正常,這樣用戶在等待時嘗試切換應用程序就不會感到不便。

如果您想知道何時結束窗口應用程序 (Process.WaitForInputIdle) 的等待 cursor,icemanind 在這里提供了一個很好的解決方案。 如果它是一個控制台應用程序,或者如果它在主 window 出現后有重要的設置要做,您將需要使用共享等待句柄,例如信號量或互斥鎖來知道何時放棄等待 cursor(或使用命名管道,但是那是更多的開銷)。 我通常使用 GUID 命名互斥體,以便它是唯一的。

在您的主應用程序中創建和等待:

Mutex unlockMutex = new Mutex(false, "MyUniqueName");

try
{
    unlockMutex.WaitOne();
}
catch (AbandonedMutexException ex)
{
    Exception ex2 = ex.InnerException;
}

在您的子應用中發布:

Mutex unlockMutex = new Mutex(false, "MyUniqueName");

// Release access to unlock mutex
try
{
    unlockMutex.ReleaseMutex();
}
catch (ApplicationException ex)
{
    Exception ex2 = ex.InnerException;
}

暫無
暫無

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

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