#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
изображение 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
Это должно обрабатывать небольшие изменения цвета, которые вы видите, и определять то, что вы ищете.