如何确定我的应用程序是否处于活动状态(具有焦点)

时间:2011-08-13 10:49:16

标签: c# .net wpf

有没有办法判断我的应用程序是否处于活动状态,即它的任何窗口都有.IsActive = true?

我正在编写Messenger应用程序,并希望它在任务栏中闪烁,当它处于非活动状态并且新消息到达时。

5 个答案:

答案 0 :(得分:9)

使用P / Invoke和循环

[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();

private static bool IsActive(Window wnd)
{
    // workaround for minimization bug
    // Managed .IsActive may return wrong value
    if (wnd == null) return false;
    return GetForegroundWindow() == new WindowInteropHelper(wnd).Handle;
}

public static bool IsApplicationActive()
{
    foreach (var wnd in Application.Current.Windows.OfType<Window>())
        if (IsActive(wnd)) return true;
    return false;
}

答案 1 :(得分:8)

您可以订阅主窗口的Activated事件,然后执行任何操作。你能尝试一下吗?

答案 2 :(得分:2)

试试这个,在你的MainForm中覆盖OnActivated方法并做你想做的任何事情

    protected override void OnActivated(EventArgs e)
    {
        // TODO : Implement your code here.
        base.OnActivated(e);
    }

跳这个帮助

答案 3 :(得分:2)

您有Activated的{​​{1}}和Deactivated个事件。

如果您希望能够绑定到Application,可以在IsActive

中添加一个属性
App.xaml.cs

当然您也可以使用

等代码访问此属性
<TextBlock Text="{Binding Path=IsActive,
                          Source={x:Static Application.Current}}"/>

App.xaml.cs

App application = Application.Current as App;
bool isActive = application.IsActive;

答案 4 :(得分:-3)

一种方法(可能会有更好的方法)可以通过Windows API找到Active窗口,然后找到活动窗口的进程名称。

if(yourProcessName == ActiveWindowProcessName)
{
    //your window is in focus
}

另一种方法是保留所有窗口的引用,当你想知道你的应用程序是否处于活动状态时,只需遍历所有窗口并检查IsActive

另一种方法是使用MainWindow的OwnedWindows属性。无论何时创建新窗口,都指定主窗口为其所有者。然后你可以迭代MainWindow的所有OwnedWindows并检查是否有任何活动。(从未尝试过这种方法)