0

我有一个计时器,除其他外,它可以检查屏幕上的 5 个点是否有颜色变化。我的程序监视电话系统应用程序并检查是否有来自 5 个按钮中的任何一个的新来电。我正在根据我发布的另一个问题使用以下代码。 在 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

使用此代码,GDI 对象会在短时间内迅速飙升并引发 OutOfMemory 异常。我假设我没有正确释放 DC,但我似乎找不到任何其他方法来做到这一点。

4

1 回答 1

5

调用GetDC(0)一次,将其保存到变量中,然后将变量传递给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

请注意,它ReleaseDC需要两个IntPtr参数,hWnd并且hDC.

于 2012-04-06T20:18:54.420 回答