注意:有一个very similar question,但它是特定于WPF的;这个不是。
如何确定当前应用程序是否已激活(即具有焦点)?
答案 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
}