这是一个neubi问题......我在互联网上搜索过,但显然我的问题并不好。
我的winform程序启动一个外部应用程序,我们称之为“watchit.exe”。 从进程开始到用户可见(最终作为任务管理器中的任务出现),它需要5到15秒的时间。我不希望用户在这段时间内感到沮丧并继续点击启动watchit的按钮,所以我需要一个等待光标或其他一些指示。
此表单上有几个自定义控件,有没有办法用等待光标覆盖它们各自的游标?也许在表单状态条中放置文本会比等待光标更好吗?
当Watchit启动并运行时,我怎么知道我的程序中所以我可以将光标设置回默认值,或者更改表单状态条中的文本?我不想使用计时器来检查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
答案 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;
}