Определение цвета с экрана exe-файла

#vb6

#vb6

Вопрос:

У меня есть программа управления принтером (EXE-файл)

Когда принтер работает должным образом, программа показывает зеленый цвет. И отображает красный цвет при остановке. Теперь: я хочу написать код распознавания цвета на Visual Basic таким образом, чтобы написанная программа могла обнаруживать изменение цвета этой Exe-программы. То есть, чтобы понять, когда принтер останавливается, а когда запускается

У кода, который я написал, есть проблема: когда я помещаю форму в paint. Цветовые коды отличаются, и я не могу выполнить эту проверку с помощью нескольких кодов

мой код:

 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 Sub
  

изображение 1

1

изображение 2

2

Комментарии:

1. Выводится ли ваша программа управления принтером на рабочий стол? Если у него есть собственное окно, то сначала вы должны найти его окно.

2. если я получу окно? Будут ли номера цветового кода правильными?

3. Я не знаю 🙂 Вам нужно попробовать это самостоятельно.

4. На вашем изображении не видно, на чем отображается красный / зеленый. Хотя, вероятно, это не рабочий стол. Попробуйте использовать Spy , чтобы получить информацию о фактическом окне, для которого окрашен красный / зеленый, а затем используйте это, чтобы получить правильное окно.

5. Спасибо, проблема была решена

Ответ №1:

Похоже, что пиксельные данные взяты из строки заголовка вашего окна. Красный цвет на вашем изображении ближе к 236 (236,26,37 — это значение RGB), а то, что отображается в вашей форме, преобразуется в 137, 126, 180 (RGB для 897EB4) и 146, 135, 187 (RGB для 9287BB). Вы можете видеть, что цвет неправильный, потому что фон вашей формы не соответствует красному цвету на рабочем столе.

Я бы попробовал прочитать пиксель дальше от формы:

 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
  

Это должно обрабатывать небольшие изменения цвета, которые вы видите, и определять то, что вы ищете.