启动外部应用程序时创建等待光标

时间:2011-07-12 16:51:51

标签: c#

这是一个neubi问题......我在互联网上搜索过,但显然我的问题并不好。

我的winform程序启动一个外部应用程序,我们称之为“watchit.exe”。 从进程开始到用户可见(最终作为任务管理器中的任务出现),它需要5到15秒的时间。我不希望用户在这段时间内感到沮丧并继续点击启动watchit的按钮,所以我需要一个等待光标或其他一些指示。

  1. 此表单上有几个自定义控件,有没有办法用等待光标覆盖它们各自的游标?也许在表单状态条中放置文本会比等待光标更好吗?

  2. 当Watchit启动并运行时,我怎么知道我的程序中所以我可以将光标设置回默认值,或者更改表单状态条中的文本?我不想使用计时器来检查Watchit是否已启动并运行...甚至不确定要检查什么!

  3. 我试图使用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

2 个答案:

答案 0 :(得分:2)

您可以使用Process.WaitForInputIdle() method。直接来自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."

答案 1 :(得分:2)

我通常会设置一个模态对话框,其光标设置为等待光标。你可以像闪屏一样使它无边界。始终在顶部开始,以便它不会出现在任何后面,但一旦完成加载,将其设置为正常,这样用户在等待时尝试切换应用程序并不会带来不便。

如果你想知道何时结束窗口化应用程序的等待光标(Process.WaitForInputIdle),那么

icemanind在这里提供了一个很好的解决方案。如果它是一个控制台应用程序,或者在主窗口出现后有重要的设置要做,则需要使用共享等待句柄(如信号量或互斥锁)来知道何时删除等待游标(或使用命名管道,但是这是更多的开销)。我通常用一个GUID命名一个mutxe,这样它就是唯一的。

在主应用中创建并等待:

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;
}