2012-04-06 8 views
0

Ich habe einen Timer, der unter anderem prüft, 5 Stellen auf dem Bildschirm für einen Farbwechsel. Mein Programm überwacht eine Telefonsystem-App und prüft, ob von einer der fünf Tasten ein neuer Anruf eingeht. Ich verwende den folgenden Code basierend auf einer anderen Frage, die ich gestellt hatte. Monitor an area of the screen for a certain color in Visual BasicSpeicherleck mit GetPixel/GetDC in Visual Basic

Private Function CheckforCall() 
    Try 
     Dim queue1 As Integer = GetPixel(GetDC(0), 40, 573) 
     Dim queue2 As Integer = GetPixel(GetDC(0), 140, 573) 
     Dim queue3 As Integer = GetPixel(GetDC(0), 240, 573) 
     Dim queue4 As Integer = GetPixel(GetDC(0), 340, 573) 
     Dim queue5 As Integer = GetPixel(GetDC(0), 440, 573) 
     ReleaseDC(0) 

    <code snipped - Checks to see if the pixel color matches and 
     returns true or false> 

    Catch ex As Exception 
     Return False 
    End Try 
End Function 

diesen Code verwenden, Objekte GDI skyrockets sehr schnell und innerhalb kurzer Zeit, wirft eine OutOfMemory Ausnahme. Ich gehe davon aus, dass ich den DC nicht richtig freigebe, aber ich finde keinen anderen Weg, dies zu tun.

Antwort

5

Anruf einmal GetDC(0), es auf eine Variable speichern, und übergeben Sie die Variable ReleaseDC:

Dim hDC As IntPtr = GetDC(0) 
Try 
    Dim queue1 As Integer = GetPixel(hDC, 40, 573) 
    Dim queue2 As Integer = GetPixel(hDC, 140, 573) 
    Dim queue3 As Integer = GetPixel(hDC, 240, 573) 
    Dim queue4 As Integer = GetPixel(hDC, 340, 573) 
    Dim queue5 As Integer = GetPixel(hDC, 440, 573) 
    ... 
Catch ex As Exception 
    Return False 
Finally 
    ReleaseDC(0, hDC) 
End Try 

Beachten Sie, dass ReleaseDC nimmt zwei IntPtr Argumente, hWnd und hDC.

+1

Auch, fügen Sie die ReleaseDC in einem endgültigen Block, so ist es auch auf Ausnahme aufgeräumt. –

+0

Schließlich nicht Catch. Jetzt wird es im normalen Pfad nicht aufräumen. :-) –

+0

@JasonMalinowski: Ups! Habe ich es jetzt verstanden? –