2016-08-08 2 views
-1

Native Window Handles sind kein Müll gesammelt. Nachdem ich im Internet gesucht habe, habe ich über SafeProcessHandle im MSDN Artikel erfahren. Versucht, es zu implementieren, aber ich erhalte ‚System.Runtime.InteropServices.SEHException‘Intptr Handle sind nicht Garbage Collected

https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.safehandle.aspx

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using System.Diagnostics; 
using System.Runtime.InteropServices; 
using System.Threading; 

namespace TestHandle 
{ 
class Program 
{ 
    [DllImport("user32.dll")] 
    static extern IntPtr GetForegroundWindow(); 

    [DllImport("user32.dll")] 
    static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count); 

    [DllImport("user32.dll", SetLastError = true)] 
    static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId); 

    static void Main(string[] args) 
    { 
     while (true) 
     { 
      IntPtr hWnd = GetForegroundWindow(); 

      int processID = 0; 
      int threadID = GetWindowThreadProcessId(hWnd, out processID); 


      using (Process p = Process.GetProcessById(processID)) 
      { 
       StringBuilder text = new StringBuilder(256); 
       GetWindowText(hWnd, text, 256); 
       Console.WriteLine(text.ToString());      
      } 

      Console.WriteLine(hWnd); 
      Thread.Sleep(100); 
     } 

     char tmp = 'q'; 
     while (Console.Read() != tmp) ; 
    } 
} 
} 

Um aktuell geöffnete Fenster zu erhalten, ich versuche es durch Timer zu implementieren und auch durch, während versucht Schleife, aber es erhöht den Speicherbedarf und wenn ich eine lange laufende Konsole-Anwendung entwerfe, die funktioniert, bis der PC läuft, werden die Dinge schlimmer. Kann mir jemand dabei helfen?

+0

Sie besitzen diese Fenster nicht, also müssen Sie nicht aufräumen. Kein Code versucht hier aufzuräumen. Keine Verwendung von Salbeigriffen kann gesehen werden. Dienste haben keinen Zugriff auf interaktive Desktops. Bitte machen Sie deutlich, was Sie erreichen wollen und was das Problem ist. –

+0

Es ist eine lange laufende Konsolenanwendung, um laufendes Fenster zu erhalten. Ja, Sie sind wahr, aber wenn Sie diesen Code in einem Timer ausführen, werden Sie feststellen, dass der Speicherbedarf ständig zunimmt. – Jef

Antwort

0

GetForegroundWindow gibt einen Fenstergriff zurück, den Sie nicht aufräumen müssen. Der in der Frage gezeigte Code ist nicht undicht und erfordert keine sicheren Handles. Sie verwenden sichere Handles, wenn Sie nicht verwaltete Ressourcen aufräumen müssen. Das ist hier nicht der Fall.

Wenn Sie tatsächlich ein Problem mit einem Leck haben, bezieht es sich nicht auf den angezeigten Code, der nicht geändert werden muss.

aktualisiert

In Bezug auf Ihre Aktualisierung ist es sinnlos, den Prozess-ID und ein .net-Prozess-Objekt zu erhalten. Du benutzt sie nicht. Sie können den Fenstertext mit dem Fenstergriff anfordern, wie Sie es auch tun.

Nichts deutet darauf hin, ein Leck von nicht verwalteten Ressourcen und nichts hier erfordert sichere Handles. Wenn die Nutzung des Prozessspeichers zunimmt, wäre dies das normale Verhalten für einen GC-basierten Prozess. Bei jedem Durchlauf der Schleife wird ein neues StringBuilder-Objekt erstellt.

Der Code kann viel einfacher sein:

StringBuilder text = new StringBuilder(256); 
    while (true) 
    { 
     IntPtr hWnd = GetForegroundWindow(); 
     GetWindowText(hWnd, text, 256); 
     Console.WriteLine(text.ToString()); 
     Console.WriteLine(hWnd); 
     Thread.Sleep(100); 
    } 

Bitte beachte, dass ich ein einziges Stringbuilder-Objekt erneut verwendet, das zumindest stetige Zunahme der verwalteten Speichernutzung verhindern.

Sie sollten auch die Rückgabewerte von API-Aufrufen auf Fehler prüfen, aber ich möchte hier nicht auf die Details der Vorgehensweise eingehen.

+0

Sir, ich habe meinen Code aktualisiert. Und jede Sekunde erhöht es Speicherbytes. – Jef

+0

Ich beantwortete die Frage, die Sie gestellt haben. Jetzt stellst du eine andere Frage. Stell dir vor, wie das mich ermutigt. –

+0

Ich stecke mit dem Problem fest und um es besser zu erklären, habe ich den gesamten Quellcode eingefügt. Ich schätze Ihre Bedenken hier sehr. – Jef

Verwandte Themen