Примечание: существует очень похожий вопрос, но он специфичен для WPF; этого нет.
Как определить, активировано ли текущее приложение (т.е. имеет фокус)?
Примечание: существует очень похожий вопрос, но он специфичен для WPF; этого нет.
Как определить, активировано ли текущее приложение (т.е. имеет фокус)?
Это работает:
/// <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, но я могу жить с этим: -)
поскольку, вероятно, какой-то элемент вашего пользовательского интерфейса содержит фокус для активной формы.
this.ContainsFocus
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.containsfocus(v=vs.110).aspx
Вы можете подписаться на Главное окно Активированное событие
Обработайте Активированное событие вашей основной формы заявки.
Решение, которое я нашел, которое не требует ни нативных вызовов, ни требует обработки событий, - это проверить Form.ActiveForm
. В моих тестах это было null
, когда никакое окно в приложении не было сфокусировано и в противном случае было бы ненулевым.
var windowInApplicationIsFocused = Form.ActiveForm != null;
А, это специфично для winforms. Но это касается моей ситуации; -).
Сначала возьмите дескриптор либо с помощью:
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();
В WPF проще всего проверить, активно ли окно:
if(this.IsActive)
{
//the window is active
}