有没有办法判断我的应用程序是否处于活动状态,即它的任何窗口都有.IsActive = true?
我正在编写Messenger应用程序,并希望它在任务栏中闪烁,当它处于非活动状态并且新消息到达时。
答案 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
并检查是否有任何活动。(从未尝试过这种方法)