Определить, активировано ли текущее приложение (имеет фокус) - PullRequest
42 голосов
/ 23 августа 2011

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

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

Ответы [ 7 ]

67 голосов
/ 23 августа 2011

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

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

10 голосов
/ 04 сентября 2014

, поскольку вероятно, что какой-то элемент в вашем пользовательском интерфейсе содержит фокус для активной формы, попробуйте:

this.ContainsFocus

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

3 голосов
/ 27 октября 2017

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

var windowInApplicationIsFocused = Form.ActiveForm != null;

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

3 голосов
/ 23 августа 2011
1 голос
/ 23 августа 2011

Обработка Активированного события вашей основной формы заявки.

0 голосов
/ 25 августа 2017

В WPF самый простой способ проверить, активно ли окно, это:

if(this.IsActive)
{
 //the window is active
}
0 голосов
/ 23 августа 2011

Сначала получите ручку, используя:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...