开发者

How can I get the RGB color of the pixel at the cursor location using VB.NET?

How can I get the color of a pixel at the location of the cursor? I know how to get the mouses position using MousePosition but I can not figure out how to get the pixel color at that loca开发者_JS百科tion.


A C# version: How do I get the colour of a pixel at X,Y using c# ?
Should be easy to rewrite in VB.NET.


Quick simple very slow but it works.

The idea is to copy the screen to a bitmap which can be done using the GDI+ build into the drawing.graphics object. Then simply read the bitmap that it generates. Get pixel is very slow. The best way it to read the image byte array directly.

Function MakeScreenShot() As Drawing.Bitmap
    Dim out As Drawing.Bitmap

    'Get the screen Size
    Dim bounds As Rectangle = Screen.GetBounds(Point.Empty)

    'create the bitmap
    out = New Drawing.Bitmap(bounds.Width, bounds.Height)

    'create a graphic object to recive the pic
    Using gr As Drawing.Graphics = Graphics.FromImage(out)
        'Copy the screen using built in API
        gr.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size)
    End Using

    Return out
End Function

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
    Dim BM As Drawing.Bitmap = MakeScreenShot()
    Dim mouseloc As Point = Cursor.Position
    Dim c As Color = BM.GetPixel(mouseloc.X, mouseloc.Y) ' The Slowest way possable to read a color

    Debug.Print(c.R & "," & c.G & "," & c.B)
End Sub

Enjoy.


Try this code:

#Region "#include"
Imports System
Imports System.Drawing
Imports System.Runtime.InteropServices
#End Region
Public Class Test

#Region "From Windows API"
    <DllImport("user32.dll", SetLastError:=True)> _
    Public Shared Function GetWindowDC(ByVal hwnd As IntPtr) As IntPtr
        'Do not try to name this method "GetDC" it will say that user32 doesnt have GetDC !!!
    End Function

    <DllImport("user32.dll", SetLastError:=True)> _
    Public Shared Function ReleaseDC(ByVal hwnd As IntPtr, ByVal hdc As IntPtr) As Int32

    End Function

    <DllImport("gdi32.dll", SetLastError:=True)> _
    Public Shared Function GetPixel(ByVal hdc As IntPtr, ByVal nXPos As Integer, ByVal nYPos As Integer) As UInteger

    End Function
#End Region
    REM --Test--
#Region "Some Functions"
    Public Function GetPixelColor(ByVal x As Integer, ByVal y As Integer) As Color
        Dim hdc As IntPtr = GetWindowDC(IntPtr.Zero)
        Dim pixel As UInteger = GetPixel(hdc, x, y)
        Dim color As Color
        ReleaseDC(IntPtr.Zero, hdc)
        MsgBox(pixel)
        color = color.FromArgb(Int(pixel And &HFF), _
        Int(pixel And &HFF00) >> 8, _
        Int(pixel And &HFF0000) >> 16)
        Return color
    End Function
#End Region
    REM --Test--
#Region "OnClick"
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim mouseloc As Point = Cursor.Position
        Me.Label1.BackColor = GetPixelColor(mouseloc.X, mouseloc.Y)
        Me.Refresh()
    End Sub
#End Region
End Class

You need button (name==Button1) and label (name==Label1). To get color from screen you will need to use Timer.

If you need to rewrite code from C# to VB.NET use this link: http://www.harding.edu/fmccown/vbnet_csharp_comparison.html


Keep it simple, not very optimized but do the job:

    Public Class Form1
    Declare Auto Function FindWindow Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr

    Declare Function GetDC Lib "user32" (ByVal hWnd As IntPtr) As IntPtr
    Declare Function ReleaseDC Lib "user32" (ByVal hwnd As IntPtr, ByVal hdc As IntPtr) As IntPtr

    Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As IntPtr, ByVal X As Int32, ByVal Y As Int32) As Int32

    Private Function CheckScreen()
        Dim CursorLoc As Point = Cursor.Position
        Dim hDC As IntPtr = GetDC(0) '0 = Get the color to any window on screen, not only your app
        Try
            Dim CursorColor As Integer = GetPixel(hDC, CursorLoc.X, CursorLoc.Y)
            Me.Panel1.BackColor = ColorTranslator.FromWin32(CursorColor) 'a simple panel to show the color
            Me.Refresh()
            Return True
        Catch ex As Exception
            Return False
        Finally
            ReleaseDC(0, hDC)
        End Try

    End Function

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Timer1.Start() 'Timer with a short delay 
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        CheckScreen()
    End Sub
End Class


This is actually harder than you would guess. I would look for some example code that already does it, and copy their technique.

In the end, the algorithm is going to have to perform these operations:

  1. Get a bitmap of the desktop/window close to the cursor position
  2. Index into that bitmap with the cursor position and extract the pixel color

It sounds simple, but is not easy.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜