如何使用VB.NET获取光标位置处像素的RGB颜色?

3

如何获取光标位置像素的颜色?我知道如何使用MousePosition获取鼠标位置,但我无法弄清楚如何获取该位置处的像素颜色。

5个回答

4

1
+1 有一些工具可以将C#转换为VB.Net(至少在某种程度上),因此您可能需要将代码复制到该位置并查看您获得的内容:http://www.developerfusion.com/tools/convert/csharp-to-vb/. - vgru

1

快速简单但非常慢,但它可以工作。

这个想法是将屏幕复制到位图中,可以使用内置于drawing.graphics对象中的GDI+来完成。然后简单地读取生成的位图。获取像素非常缓慢。最好的方法是直接读取图像字节数组。

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

享受吧。


1

尝试这段代码:

#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

您需要一个按钮(名称==Button1)和一个标签(名称==Label1)。要从屏幕获取颜色,您需要使用计时器。
如果您需要将C#代码重写为VB.NET,请使用此链接:http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

0

保持简单,不要过于优化但能完成任务:

    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

-2

这实际上比你想象的要难。我建议寻找一些已经完成此操作的示例代码,并复制它们的技术。

最终,算法将需要执行以下操作:

  1. 获取靠近光标位置的桌面/窗口的位图
  2. 使用光标位置索引该位图并提取像素颜色

听起来很简单,但并不容易。


这就是我一直看到的,但我能找到的唯一示例代码是用C++编写的,而且我大部分都不理解。 - Bryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接