2010-01-14 19 views
5

Estoy trabajando en una aplicación que necesita obtener el último identificador de ventana activa. Supongamos que mi aplicación se está ejecutando, entonces quiero obtener el último identificador activo de la ventana que acaba de abrir justo antes de mi aplicación.Obtener la última ventana activa: Obtener Ventana previamente activa

@ EDIT1: Esta no es la pregunta duplicada. Necesito obtener el mango de la última ventana activa, no la ventana actual.

Respuesta

3

Esto es similar a alternate SO question, yo asumiría que acaba de realizar un seguimiento de la ventana activa y sobre el cambio A continuación, conocer la activa anteriormente

Editar, esto es básicamente el código copiado de la pregunta que enlazadas que estaba buscando para la ventana activa actual pero con la lógica para persistir el lastHandle e identificar cuándo tienes un nuevo lastHandle. No es una implementación comprobable y compilable:

[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

Esta no es la pregunta duplicada. Necesito obtener el mango de la última ventana activa, no la ventana actual. –

+1

@Vinay, dije similar. Esa pregunta proporciona el conocimiento sobre cómo usar las API de Win32, así que asumí que el identificador devuelto por GetForegroundWindow() era apropiado para su uso. Esto no es un duplicado, pero definitivamente es similar o una pregunta secundaria dentro de otra más grande. Si está buscando una implementación para copiar y pegar lo siento, pero le di lógica en mi respuesta ... seguimiento de todas las ventanas activas, una vez que haya encontrado una segunda ventana ACTIVE, ahora tiene conocimiento de la anterior. Voy a editar con un poco de código psuedo. –

+0

Gracias Jamie Altizer. –

1

Necesitaba lo mismo que el último identificador de la ventana anterior que tenía abierta. La respuesta de Jamie Altizer estuvo cerca, pero la modifiqué para evitar sobrescribir la ventana anterior cuando mi aplicación vuelve a enfocarse. Aquí está la clase completa que hice con el temporizador y todo.

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; 
} 
Cuestiones relacionadas