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