2010-01-14 119 views
5

我正在研究需要获取最后一个活动窗口句柄的应用程序。假设我的应用程序正在运行,那么我希望获得最后一个活动窗口句柄,该句柄刚好在我的应用程序之前打开。获取最后一个活动窗口:获取以前活动的窗口

@ EDIT1:这不是重复的问题。我需要获取最后一个活动窗口的句柄,而不是当前窗口。

回答

3

这类似于 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; 
    } 
} 
+0

这不是重复的问题。我需要获取最后一个活动窗口的句柄,而不是当前窗口。 – 2010-01-15 08:39:48

+1

@Vinay,我说过类似的。该问题给出了如何使用Win32 API的知识,因此我认为GetForegroundWindow()返回的句柄适合您的使用。这不是一个重复的问题,而是一个更大的问题中的绝对相似问题或子问题。 如果您正在寻找复制和粘贴抱歉的实现,但我在答案中给了您逻辑...跟踪所有ACTIVE窗口,一旦找到第二个ACTIVE窗口,您现在已经了解了以前的知识。我将用一些伪代码编辑。 – 2010-01-15 12:59:46

+0

谢谢杰米Altizer。 – 2010-01-18 09:49:43

1

我需要与我打开的上一个窗口的最后一个句柄相同的东西。 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; 
}