我正在开发一个需要获取最后一个活动窗口句柄的应用程序。假设我的应用程序正在运行,那么我想获取之前刚刚在我的应用程序之前打开的最后一个活动窗口句柄。
@ EDIT1:这不是重复的问题。我需要获取最后一个活动窗口的句柄而不是当前窗口。
答案 0 :(得分:5)
这类似于 alternate SO question,我认为您只需跟踪活动窗口,然后在更改后您就会知道之前有效的
编辑,这基本上是从我链接的问题中复制的代码,该问题是寻找当前活动窗口但是有逻辑来持久化lastHandle并确定何时有新的lastHandle。它不是经过验证的,可编译的实现:
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
static IntPtr lastHandle = IntPtr.Zero;
//This will be called by your logic on when to check, I'm assuming you are using a Timer or similar technique.
IntPtr GetLastActive()
{
IntPtr curHandle = GetForeGroundWindow();
IntPtr retHandle = IntPtr.Zero;
if(curHandle != lastHandle)
{
//Keep previous for our check
retHandle = lastHandle;
//Always set last
lastHandle = curHandle;
if(retHandle != IntPtr.Zero)
return retHandle;
}
}
答案 1 :(得分:2)
我需要从上一个窗口打开的最后一个句柄的相同内容。 Jamie Altizer的答案很接近,但我修改它以避免在我的应用程序再次获得焦点时覆盖之前的窗口。这是我用计时器和所有东西制作的完整课程。
static class ProcessWatcher
{
public static void StartWatch()
{
_timer = new Timer(100);
_timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
_timer.Start();
}
static void timer_Elapsed(object sender, ElapsedEventArgs e)
{
setLastActive();
}
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
public static IntPtr LastHandle
{
get
{
return _previousToLastHandle;
}
}
private static void setLastActive()
{
IntPtr currentHandle = GetForegroundWindow();
if (currentHandle != _previousHandle)
{
_previousToLastHandle = _previousHandle;
_previousHandle = currentHandle;
}
}
private static Timer _timer;
private static IntPtr _previousHandle = IntPtr.Zero;
private static IntPtr _previousToLastHandle = IntPtr.Zero;
}