繁体   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