【问题标题】:wpf detects if another software is opened [duplicate]wpf检测是否打开了另一个软件[重复]
【发布时间】:2018-04-06 07:40:16
【问题描述】:

我有一个 WPF 程序需要检测是否打开了另一个软件。如果打开,我的程序会自动连接到它:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    if(!DataModel.IsConnected)
    {
      connect();
    }
}

但是,通过这种方式,它只能在我运行 WPF 窗口之前打开该软件时建立连接。如果我希望 WPF 程序始终可以检测软件是否打开 - 即使在我运行 WPF 窗口后打开了软件。

【问题讨论】:

  • 我不认为这是重复的,connect() 似乎正在工作。它只需要重写循环直到成功。
  • @dannymc18 这正是该问题的答案 - 如何检查应用程序是否正在运行

标签: c# wpf process


【解决方案1】:

您需要定期调用connect() 方法,例如使用计时器,或者让其他应用程序定期通知您的 WPF 应用程序。

这是一个基本示例,应该可以为您提供思路。一旦加载了窗口,它就会调用connect() 方法,如果该方法返回false,它会启动一个计时器,每隔1.5 秒再次调用该方法,直到该方法返回true

System.Timers.Timer _timer;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
    if (!connect())
    {
        //start a timer that calls connect() at regular intervals until it returns true.
        _timer = new System.Timers.Timer(TimeSpan.FromSeconds(1.5).TotalMilliseconds);
        _timer.Elapsed += Timer_Elapsed;
    }

}

private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    if (connect())
    {
        _timer.Stop();
        _timer.Dispose();
    }
}

【讨论】:

  • 也不要忘记你想在ui线程上做改变的dispatchertimer案例
  • 没错,但为什么 connect 方法会修改任何 UI 元素?
  • 如果连接失败,有人会想要一个加载搜索栏或错误消息。
  • 这与原始问题和答案无关。
  • 谢谢。这是使用计时器的好方法。 Timer_Elapsed()函数中的参数能去掉吗?
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 2013-08-07
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多