如何确定我的应用程序是否活跃(有焦点)

本文关键字:焦点 活跃 是否 何确定 我的 应用程序 | 更新日期: 2023-09-27 18:05:34

是否有一种方法来告诉我的应用程序是活动的,即它的任何窗口有。isactive =true?

我正在编写信使应用程序,并希望它在非活动和新消息到达时在任务栏中闪烁。

如何确定我的应用程序是否活跃(有焦点)

已使用的p/Invoke和loop

[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;
}

你可以订阅主窗口的激活事件,然后做任何你想做的。你能试一下吗?

您有ApplicationActivatedDeactivated事件

如果你想绑定到IsActive,你可以在App.xaml.cs中添加一个属性

<TextBlock Text="{Binding Path=IsActive,
                          Source={x:Static Application.Current}}"/>

当然你也可以在像

这样的代码中访问这个属性
App application = Application.Current as App;
bool isActive = application.IsActive;

App.xaml.cs

public partial class App : Application, INotifyPropertyChanged
{
    private bool m_isActive;
    public bool IsActive
    {
        get { return m_isActive; }
        private set
        {
            m_isActive = value;
            OnPropertyChanged("IsActive");
        }
    }
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        Activated += (object sender, EventArgs ea) =>
        {
            IsActive = true;
        };
        Deactivated += (object sender, EventArgs ea) =>
        {
            IsActive = false;
        };
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

试试这个,在你的MainForm中重写OnActivated方法,然后做任何你想做的

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

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

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

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

另一种方法是使用主窗口的OwnedWindows属性。每当你创建一个新的窗口分配主窗口的所有者。然后,您可以迭代MainWindow的所有OwnedWindows,并检查是否有活动的。(从未尝试过这种方法)