我有一个打印机控制程序( EXE文件)
当打印机正常工作时,程序显示绿色。并在停止时显示红色。现在:我想用Visual Basic编写一个颜色识别代码,这样编写的程序就可以检测到该Exe程序的颜色变化。也就是说,要了解打印机何时停止以及何时启动
我写的代码有一个问题:当我把窗体放在油漆上时。颜色代码关心的是不同的,我不能使用多个代码执行此检查
我的代码:
Declare Function GetPixel Lib "gdi32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long) As Long
Declare Function GetDesktopWindow Lib "user32" () As Long
Declare Function GetWindowDC Lib "user32" (ByVal hWnd As Long) As Long
Private Sub Timer1_Timer()
Dim Pixel As Long
Dim Left As Long
Dim Top As Long
Dim hDC As Long
' Get Desktop window
hDC = GetWindowDC(GetDesktopWindow)
' Use size of screen
Left = Me.Left / Screen.TwipsPerPixelX
Top = Me.Top / Screen.TwipsPerPixelY
Pixel = GetPixel(hDC, Left, Top)
Me.Caption = Hex(Pixel)
Me.BackColor = Pixel
End Subimage1

image2

发布于 2020-09-15 00:11:26
它看起来像是从你的窗口的标题栏中提取的像素数据。图像中的红色更接近236 (236,26,37是RGB值),表单显示的内容将转换为137,126,180 (897EB4的RGB )和146,135,187 (9287BB的RGB)。您可以看到颜色是错误的,因为窗体的背景与桌面上的红色不匹配。
我会试着在远离表单的地方阅读Pixel:
Left = (Me.Left / Screen.TwipsPerPixelX) - 20
Top = (Me.Top / Screen.TwipsPerPixelY) - 20尽管如此,即使颜色受到投影的影响,您也可以对正在接收的值实现一定的容差。例如,您应该使用如下函数接受预期值的+/- 10范围内的值:
Function CheckColor(p_iRed, p_iGreen, p_iBlue, p_iTargetRed, p_iTargetGreen, p_iTargetBlue, p_iTolerance) As Boolean
CheckColor = CheckColorPart(p_iRed, p_iTargetRed, p_iTolerance) And CheckColorPart(p_iGreen, p_iTargetGreen, p_iTolerance) And CheckColorPart(p_iBlue, p_iTargetBlue, p_iTolerance)
End Function
Function CheckColorPart(p_iValue, p_iTarget, p_iTolerance) As Boolean
CheckColorPart = (p_iValue >= p_iTarget - p_iTolerance And p_iValue <= p_iTarget + p_iTolerance)
End Function这应该会处理你所看到的颜色的细微变化,并检测出你正在寻找的东西。
https://stackoverflow.com/questions/63878976
复制相似问题