2010-01-14 7 views
5

Je travaille sur une application qui doit obtenir le dernier handle de fenêtre active. Supposons que mon application est en cours d'exécution, puis je veux obtenir le dernier handle de fenêtre active qui était juste précédemment ouvert juste avant mon application.Obtenir la dernière fenêtre active: Get La fenêtre précédemment ouverte

@ EDIT1: Ceci n'est pas une question en double. Je dois obtenir le handle de la dernière fenêtre active pas la fenêtre courante.

Répondre

3

Ceci est similaire à alternate SO question, je suppose que vous voulez simplement suivre la fenêtre active et sur le changement que vous sauriez alors l'actif précédemment

Modifier, ce code est essentiellement copié de la question que je liée qui était à la recherche pour la fenêtre active actuelle mais avec la logique pour persister le lastHandle et identifier quand vous avez un nouveau lastHandle. Ce n'est pas prouvé, la mise en œuvre 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

Ce n'est pas la question en double. Je dois obtenir le handle de la dernière fenêtre active pas la fenêtre courante. –

+1

@Vinay, j'ai dit similaire. Cette question donne les connaissances nécessaires pour utiliser les API Win32. J'ai donc supposé que le handle renvoyé par GetForegroundWindow() était approprié pour votre utilisation. Ce n'est pas un doublon mais certainement similaire ou une sous-question dans un plus grand demandé. Si vous cherchez une implémentation pour copier et coller désolé, mais je vous ai donné la logique dans ma réponse ... suivre toutes les fenêtres ACTIVE, une fois que vous avez trouvé une seconde fenêtre ACTIVE, vous avez maintenant la connaissance de la précédente. Je vais éditer avec du code Psuedo. –

+0

Merci Jamie Altizer. –

1

je besoin de la même chose de la dernière poignée de la fenêtre précédente j'avais ouvert. La réponse de Jamie Altizer était proche, mais je l'ai modifié pour éviter d'écraser la fenêtre précédente lorsque mon application se concentre à nouveau. Voici la classe complète que j'ai faite avec la minuterie et tout.

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; 
} 
Questions connexes