【问题标题】:How to know if the application is visible in the user interface or not如何知道应用程序在用户界面中是否可见
【发布时间】:2014-02-23 20:04:38
【问题描述】:

我正在开发一个 WPF 应用程序,我需要知道我的应用程序是否对用户可见。我尝试了 Application.Current.Activated/Deactivated 事件来更改 bool 属性并使用此 bool 来根据我的要求进行检查。一切正常,除了当弹出窗口(如 gtalk 聊天窗口)打开或我在任务栏中单击时调用 Deactivated 事件,所以我的布尔值正在改变。

如何检查我的应用是否对用户可见而不是激活/停用(检查我的应用是否是前台应用)?

    Application.Current.Activated += Current_Activated;

    Application.Current.Deactivated += Current_Deactivated;

    void Current_Deactivated(object sender, EventArgs e)
    {
        IsActive = false;
    }

    void Current_Activated(object sender, EventArgs e)
    {
        IsActive = true;
    }

如果 !IsActive 我正在显示通知。

【问题讨论】:

  • 发布代码永远不会伤害您,因为它显示了您的起点
  • 为什么您需要知道您的窗口是否对用户部分可见,即使在不活动时也是如此?你想达到什么目的?你的窗口要么是Active(有键盘/鼠标输入)要么没有。当您切换到其他应用程序(即使是一个小弹出窗口,覆盖 0.1% 的窗口)或任务栏时,您的窗口处于非活动状态。您的窗口是Visible 或完全不可见(隐藏/最小化),但是,如果您将窗口移远以 对您不可见(您看不到窗口的单个像素),它是仍然是 Visible,因为 Windows 不关心 你看到什么
  • @Sinatr 我的应用类似于 Skype(信使应用)。当我的应用程序不在前台时,我需要在消息到达时显示通知。问题是当应用程序不是前台但对用户仍然可见时,我不需要显示通知。
  • 定义前景? Skype 窗口可以隐藏(关闭)或最小化。最小化后,它在任务栏中可见,您可以单击此处或使用 alt-tab 使其处于活动状态。隐藏时,它不在任务栏中(alt-tab 不显示),您必须使用托盘图标(dblclick 或右键单击菜单)来恢复它。什么时候显示通知,什么时候不显示?

标签: c# wpf


【解决方案1】:
protected override void OnSourceInitialized(EventArgs e)
{
    base.OnSourceInitialized(e);
    HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
    source.AddHook(WndProc);
}

private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    if (msg == 0x1c)
    {
        OnActivateApp(wParam != IntPtr.Zero);
    }
    return IntPtr.Zero;
}

protected void OnActivateApp(bool activate)
{
    Console.WriteLine("Activate {0}", activate);
}

不好意思,不会写,英文不太懂,不过这篇文章增强了解决方法http://www.codeproject.com/Articles/704390/How-to-be-Notified-when-your-application-is-active

【讨论】:

    【解决方案2】:

    您可以使用Application.Windows property 告诉您哪些Windows 已被实例化并且未关闭(当前打开),然后使用Window.IsActive property 来判断它们中的任何一个当前是否处于活动状态:

    Window activeWindow = 
        Application.Current.Windows.OfType<Window>().SingleOrDefault(w => w.IsActive)); 
    if (activeWindow != null) 
    {
        // activeWindow is the active Window
    }
    

    【讨论】:

      【解决方案3】:

      有一个VisibilityChanged 活动,您可以在其中联系。您将在其EventArgs 中找到当前的可见性状态。

      如果我需要发布任何代码,请告诉我 ;-)

      【讨论】:

      • 当我们需要检查窗口是否部分可见时,与VisibilityChanged无关。
      • @AnatoliiGabuza 你能告诉我们怎么做吗!
      猜你喜欢
      • 2011-10-14
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多