【问题标题】:Get last active window: Get Previously active window获取最后一个活动窗口:获取上一个活动窗口
【发布时间】:2011-01-05 02:13:18
【问题描述】:

我正在开发一个需要获取最后一个活动窗口句柄的应用程序。假设我的应用程序正在运行,那么我想获取上次在我的应用程序之前打开的活动窗口句柄。

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

【问题讨论】:

    标签: c#


    【解决方案1】:

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

    【讨论】:

    • 这不是重复的问题。我需要获取最后一个活动窗口的句柄而不是当前窗口。
    • @Vinay,我说过类似的。该问题提供了如何使用 Win32 API 的知识,因此我假设 GetForegroundWindow() 返回的句柄适合您使用。这不是重复的,但绝对是相似的,或者是一个更大的问题中的子问题。如果您正在寻找复制和粘贴的实现,抱歉,但我在回答中给了您逻辑......跟踪所有活动窗口,一旦您找到第二个活动窗口,您现在就知道前一个了。我将使用一些伪代码进行编辑。
    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 2012-05-03
      • 2013-02-06
      • 2012-10-29
      • 1970-01-01
      相关资源
      最近更新 更多