|
Die Farbe eines Bildschirmpunktes liefert Ihnen die API-Funktion GetPixel, ähnlich wie die Methode Point eines Forms, einer Pictures usw. in Visual Basic. Neben den Bildschirm-Koordinaten des Punktes (in Pixels) müssen Sie GetPixel noch den so genannten Geräte-Kontext übergeben. Normalerweise wird hier der Geräte-Kontext eines Fensters angegeben. Diesen erhalten Sie wiederum von der API-Funktion GetDC zu einem gegebenen Fenster-Handle. Der Bildschirm als Ganzes ist jedoch kein eigenständiges Fenster, so dass Sie statt dessen einfach den Wert 0 anstatt eines Fenster-Handles übergeben.
Wenn Sie statt bekannter Koordinaten eines Bildpunktes im Bildschirm die Farbe des sich gerade unter dem Mauszeiger befindlichen Punktes ermitteln wollen (genauer gesagt: des Punktes unter dem so genannten "Hotspot", der beim Klicken relevanten Stelle des Mauszeigers), können Sie die Koordinaten dieses Punktes von der API-Funktion GetCursorPos erhalten. Sie übergeben dieser eine benutzerdefinierte Variable des Typs POINTAPI, die die Koordinaten X und Y als Elemente des Datentyps Long enthält. GetCursorPos füllt dann die beiden Elemente mit den aktuellen Koordinaten-Werten des Mauszeigers.
Ein per GetDC gelieferter Geräte-Kontext ist gewissermaßen nur "geliehen". Sie müssen ihn nach Gebrauch wieder freigeben. Dies erfolgt abschließend mit der API-Funktion ReleaseDC, der sie wieder das betreffende Fenster-Handle (hier gleichfalls 0 für den Bildschirm) und den Geräte-Kontext übergeben.
Die Hilfsfunktion ScreenPixelColor fasst diese Aufrufe zusammen. Lassen sie eine der beiden in Pixels zu übergebenden Koordinaten weg, werden automatisch die aktuellen Koordinaten des Mauszeigers ermittelt. Die Funktion gibt den Long-Farbwert des Bildpunktes zurück.
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Declare Function GetPixel Lib "gdi32" _
(ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function GetCursorPos Lib "user32" _
(lpPoint As POINTAPI) As Long
Private Declare Function GetDC Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" _
(ByVal hwnd As Long, ByVal hdc As Long) As Long
Public Function ScreenPixelColor(Optional ByVal X As Long = -1, _
Optional ByVal Y As Long = -1) As Long
Dim nPoint As POINTAPI
Dim nDC As Long
If (X < 0) Or (Y < 0) Then
GetCursorPos nPoint
Else
nPoint.X = X
nPoint.Y = Y
End If
nDC = GetDC(0)
ScreenPixelColor = GetPixel(nDC, nPoint.X, nPoint.Y)
ReleaseDC 0, nDC
End Function
|