2010-01-14 20 views

Antwort

3

Dies zu ähnlich ist alternate SO question ich Sie nur das aktive Fenster und bei einer Änderung verfolgen würde davon ausgehen, würden Sie würden wissen, dann die zuvor aktive

bearbeiten, das ist im Grunde von der Frage kopierten Code ich, dass verknüpft war auf der Suche für das aktuelle aktive Fenster, aber mit Logik, um den lastHandle beizubehalten und zu identifizieren, wenn Sie einen neuen lastHandle haben. Es ist keine bewährte, kompilierbare Implementierung:

[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

Dies ist nicht die doppelte Frage. Ich brauche das Handle des letzten aktiven Fensters und nicht das aktuelle Fenster. –

+1

@Vinay, sagte ich ähnlich. Diese Frage gibt das Wissen, wie Win32-APIs zu verwenden, also nahm ich an, dass das von GetForegroundWindow() zurückgegebene Handle für Ihre Verwendung geeignet war. Dies ist kein Duplikat, aber definitiv ähnlich oder eine Unterfrage in einem größeren gefragt. Wenn Sie nach einer Implementierung zum Kopieren und Einfügen von Entschuldigung suchen, aber ich gab Ihnen Logik in meiner Antwort ... verfolgen Sie alle ACTIVE-Fenster, sobald Sie ein zweites ACTIVE-Fenster gefunden haben, haben Sie jetzt Kenntnis der vorherigen. Ich werde mit etwas Pseudo-Code bearbeiten. –

+0

Danke Jamie Altizer. –

1

Ich brauchte die gleiche Sache des letzten Griffs aus dem vorherigen Fenster, das ich geöffnet hatte. Die Antwort von Jamie Altizer war knapp, aber ich habe sie geändert, um das vorherige Fenster nicht zu überschreiben, wenn meine Anwendung wieder den Fokus erhält. Hier ist die ganze Klasse, die ich mit dem Timer und allem gemacht habe.

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; 
} 
Verwandte Themen