确定当前应用程序是否已激活(具有焦点)

时间:2011-08-23 14:41:07

标签: c# .net

  

注意:有一个very similar question,但它是特定于WPF的;这个不是。

如何确定当前应用程序是否已激活(即具有焦点)?

7 个答案:

答案 0 :(得分:66)

这有效:

/// <summary>Returns true if the current application has focus, false otherwise</summary>
public static bool ApplicationIsActivated()
{
    var activatedHandle = GetForegroundWindow();
    if (activatedHandle == IntPtr.Zero) {
        return false;       // No window is currently activated
    }

    var procId = Process.GetCurrentProcess().Id;
    int activeProcId;
    GetWindowThreadProcessId(activatedHandle, out activeProcId);

    return activeProcId == procId;
}


[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int GetWindowThreadProcessId(IntPtr handle, out int processId);

它具有线程安全的优点,不需要主窗体(或其句柄),也不是特定于WPF或WinForms。它将适用于子窗口(甚至是在单独的线程上创建的独立窗口)。此外,还需要零设置。

缺点是它使用了一点P / Invoke,但我可以忍受: - )

答案 1 :(得分:10)

因为您的UI中的某些元素可能包含要激活的表单的焦点,请尝试:

this.ContainsFocus

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.containsfocus(v=vs.110).aspx

答案 2 :(得分:3)

答案 3 :(得分:3)

我发现既不需要本机调用也不需要处理事件的解决方案是检查Form.ActiveForm。在我的测试中,当应用程序中没有窗口被聚焦时,这是null,否则为非空。

var windowInApplicationIsFocused = Form.ActiveForm != null;

啊,这是针对winforms的。但这适用于我的情况; - )。

答案 4 :(得分:1)

处理主申请表的Activated event

答案 5 :(得分:0)

首先使用:

获取句柄

IntPtr myWindowHandle;

myWindowHandle = new WindowInteropHelper(Application.Current.MainWindow).Handle;

HwndSource source = (HwndSource)HwndSource.FromVisual(this);
myWindowHandle = source.Handle;

然后比较它是ForeGroundWindow:

if (myWindowHandle == GetForegroundWindow()) 
{
  // Do stuff!

}

[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();

答案 6 :(得分:0)

在WPF中,检查窗口是否处于活动状态的最简单方法是:

if(this.IsActive)
{
 //the window is active
}