mouse (x, y) de un picture, ayuda porfas

Iniciado por elmatador2, 6 Julio 2016, 07:52 AM

0 Miembros y 1 Visitante están viendo este tema.

elmatador2

hola gente, tengo este codigo que va pixel por pixel en la pantalla viendo el color y en un color determinado hace click, modifique el codigo para q no sea moviendo el mouse buscando el color, que lo busque de forma automatica... ahora necesito que al encontrar el color valla a esa posicion, pero se me va a la posicion de la pantalla entera, pero si modifico la parte del codigo resaltado no funciona de la forma q necesito... tiene q ver las aplicaciones que estan sobre ese picture tambien para tomar sus colores... este es el codigo...
Código (vb) [Seleccionar]
Private Sub Timer1_Timer()
Dim tPOS As POINTAPI
Dim sTmp As String
Dim lColor As Long
Dim lDC As Long

For tPOS.y = Picture1.ScaleHeight = 0 To Picture1.ScaleHeight - 1

For tPOS.x = Picture1.ScaleWidth = 0 To Picture1.ScaleWidth - 1

lDC = GetWindowDC(0)



Call GetPixel(HDC, tPOS.x, tPOS.y)       ' este                <---------------------




lColor = GetPixel(Picture1.HDC, tPOS.x, tPOS.y)

sTmp = Right$("000000" & Hex(lColor), 6)
Me.Caption = "  R:" & Right$(sTmp, 2) & " G:" & Mid$(sTmp, 3, 2) & " B:" & Left$(sTmp, 2)
Label1.Caption = "" & tPOS.x & " - " & tPOS.y & ""
If Right$(sTmp, 2) = "FF" And Mid$(sTmp, 3, 2) = "FF" And Left$(sTmp, 2) = "FF" Then
   Click tPOS
 Espera (5)
End If

If tPOS.x = 320 Then Stop
If tPOS.y = 6 Then Stop


Espera (0.011)
Next tPOS.x
Espera (0.011)
Next tPOS.y


End Sub



y esta es la parte del mouse

Código (vb) [Seleccionar]
Private Sub Click(p As POINTAPI)
'p.X and p.Y in absolute coordinates
'Put the mouse on the point
SetCursorPos p.x, p.y 'esta parte me lleva a (x, Y) pero de la pantalla completa y necesito q tome las coordenadas dentro del picture 1

mouse_event MOUSEEVENTF_ABSOLUTE, p.x, p.y, 0, GetMessageExtraInfo()

mouse_event MOUSEEVENTF_LEFTDOWN, p.x, p.y, 0, GetMessageExtraInfo()

mouse_event MOUSEEVENTF_LEFTUP, p.x, p.y, 0, GetMessageExtraInfo()
End Sub

espero se entienda mi conflicto, desde ya muchas gracias.

tincopasan

Creo que estás haciendo mucho copy-paste.
1)Intenta creando dos variables globales como POSX y POSY y otra sobre= boolean
2)dentro de la función del picturebox.mousemove asigna a posx = x y posy=y , a sobre true
3)dentro form.mousemove sobre = false
4)ahora dentro de la función click crea unas condiciones:
si sobre = verdadero mostrá posx y posy
sino
mostra x y 

elmatador2

gracias por responder, no se si se entendio bien lo q hice... falta parte del codigo... en el picture meto una aplicacion ejecutada. la cual si solo tomo el X, Y del picture no me toma el ejecutable dentro de el, por eso tome las que ocupa el picture pero por fuera, y al momento de indicar al mouse que se posicione en el picture (cuando automaticamente encontro un punto del color especifico), por ejemplo en el punto "0" del picture, esas coordenadas me manda al punto "0" de la pantalla en su lugar...

Código (vb) [Seleccionar]

Private Sub Command1_Click()

If sobre = True Then Print posx, posy
Print X, Y

End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
sobre = False
End Sub


Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
posx = X
posy = Y
sobre = True
End Sub



este es el codigo q me dijiste, pero no veo como ponerlo en lo que yo verdaderamente necesito.
creo que no es lo que busco, yo quiero hacer que el puntero del mouse se mueva automaticamete al punto del picture encontrado, pero de la forma que lo hago me manda al punto que necesito, pero en vez de ser del picture lo hace en el form. o capas yo no veo como implementarlo, de ser asi podrias guiarme un poco?

tincopasan

¿me estás charlando con lo de command1? y es más que obvio que falta code
Código (vb) [Seleccionar]

Private Sub Click(p As POINTAPI)
'p.X and p.Y in absolute coordinates
'Put the mouse on the point
SetCursorPos p.x, p.y 'esta parte me lleva a (x, Y) pero de la pantalla completa y necesito q tome las coordenadas dentro del picture 1

mouse_event MOUSEEVENTF_ABSOLUTE, p.x, p.y, 0, GetMessageExtraInfo()

mouse_event MOUSEEVENTF_LEFTDOWN, p.x, p.y, 0, GetMessageExtraInfo()

mouse_event MOUSEEVENTF_LEFTUP, p.x, p.y, 0, GetMessageExtraInfo()
End Sub


Código (vb) [Seleccionar]

Private Sub Click(p As POINTAPI)
'p.X and p.Y in absolute coordinates
'Put the mouse on the point
if sobre = True then
         SetCursorPos p.posx, p.posy 'esta parte me lleva a (x, Y) pero de la pantalla completa y necesito   tome las coordenadas dentro del picture 1

mouse_event MOUSEEVENTF_ABSOLUTE, p.x, p.y, 0, GetMessageExtraInfo()

mouse_event MOUSEEVENTF_LEFTDOWN, p.x, p.y, 0, GetMessageExtraInfo()

mouse_event MOUSEEVENTF_LEFTUP, p.x, p.y, 0, GetMessageExtraInfo()
else
etc. para no repetir
end if
End Sub



elmatador2

perdon, pero sigue llevandome al punto incorrecto, es mas... sigue saliendo de los terminos del picture1 lo q quiero es q respete su:
Código (vb) [Seleccionar]

For tPOS.y = Picture1.ScaleHeight = 0 To Picture1.ScaleHeight - 1

For tPOS.x = Picture1.ScaleWidth = 0 To Picture1.ScaleWidth - 1


Eleкtro

#5
Hola

Según he entendido, el problema es que medianle el algoritmo de iteración de píxeles del picturebox, obtienes unas coordenadas de la pantalla, pero tu quieres obtener las coordenadas dentro del area cliente de ese control picturebox?.

Sea como sea, puedes traducir un punto de la pantalla a un punto del área cliente de ese picturebox, y viceversa, utilizando las siguientes funciones win32 según el tipo de punto que tengas como referencia:

Un ejemplo de uso escrito en VB.NET para traducir unas coordenadas del área cliente de un control, a la pantalla:

Código (vbnet) [Seleccionar]
Dim pcbHwnd As IntPtr = Me.PictureBox1.Handle
Dim scrPt As Win32Point

NativeMethods.ClientToScreen(pcbHwnd, scrPt)
Cursor.Position = scrPt


PD: Esto en VB.NET sería más simple y sin recurrir a código no administrado, pero por el código que has publicado deduzco que estás utilizando el antiguo VB6.

Saludos








elmatador2

si, muchas gracias por tu respuesta, si es vb6... ahi me pongo a leer esa funcion. gracias por tu ayuda.