Подтвердить что ты не робот

Определите, активировано ли текущее приложение (имеет фокус)

Примечание: существует очень похожий вопрос, но он специфичен для WPF; этого нет.

Как определить, активировано ли текущее приложение (т.е. имеет фокус)?

4b9b3361

Ответ 1

Это работает:

/// <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, но я могу жить с этим: -)

Ответ 5

Решение, которое я нашел, которое не требует ни нативных вызовов, ни требует обработки событий, - это проверить Form.ActiveForm. В моих тестах это было null, когда никакое окно в приложении не было сфокусировано и в противном случае было бы ненулевым.

var windowInApplicationIsFocused = Form.ActiveForm != null;

А, это специфично для winforms. Но это касается моей ситуации; -).

Ответ 6

Сначала возьмите дескриптор либо с помощью:

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();

Ответ 7

В WPF проще всего проверить, активно ли окно:

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