Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Ejecutar en segundo plano Vb6

Estas en el tema de Ejecutar en segundo plano Vb6 en el foro de Visual Basic clásico en Foros del Web. Buenas tardes amigos del foro, pues veran tengo un programa hecho en vb6 que controla el mouse y necesito que el programa quede corriendo aun ...
  #1 (permalink)  
Antiguo 17/06/2010, 13:07
Avatar de JuJoGuAl  
Fecha de Ingreso: julio-2009
Ubicación: Venezuela
Mensajes: 754
Antigüedad: 14 años, 8 meses
Puntos: 19
Pregunta Ejecutar en segundo plano Vb6

Buenas tardes amigos del foro, pues veran tengo un programa hecho en vb6 que controla el mouse y necesito que el programa quede corriendo aun si minimizo el form, o si coloco el HIDE en el load que pueda seguir controlando el mouse...

Como le hago????

Aclaro que tengo 2 pcs donde lo programo una con Windows Vista y la otra con Windows 7...

Porfavor ayudenme es un proyecto que debo entregar...
  #2 (permalink)  
Antiguo 17/06/2010, 13:31
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 8 meses
Puntos: 29
Respuesta: Ejecutar en segundo plano Vb6

Depende de a que llames "controlar el ratón" y que método uses.

Yo tengo un programa que mueve el ratón con un gamepad y no tengo ningún problema para minimizarlo o esconderlo y seguir moviendo el ratón, ya que el programa no se detiene por estar minimizado u oculto.

Si no precisas más no creo que te dén una solución.

Saludos.
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!
  #3 (permalink)  
Antiguo 17/06/2010, 13:36
Avatar de JuJoGuAl  
Fecha de Ingreso: julio-2009
Ubicación: Venezuela
Mensajes: 754
Antigüedad: 14 años, 8 meses
Puntos: 19
Respuesta: Ejecutar en segundo plano Vb6

pues en el KEY DOWN del form tengo esto:

Dim Point As POINTAPI
GetCursorPos Point

Select Case KeyCode
Case "40"
'MsgBox ("Abajo")
Call SetCursorPos(Point.X, Point.Y + 10)

Case "38"
'MsgBox ("Arriba")
Call SetCursorPos(Point.X, Point.Y - 10)

Case "37"
'MsgBox ("Izquierda")
Call SetCursorPos(Point.X - 10, Point.Y)

Case "39"
'MsgBox ("Derecha")
Call SetCursorPos(Point.X + 10, Point.Y)
End Select

que me sirve para mover el puntero ahora quiero seguir moviendolo aun cuando el programa este oculto ya que debo de utilizar los accesos directos del escritorio con mi programa...
  #4 (permalink)  
Antiguo 17/06/2010, 14:01
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 8 meses
Puntos: 29
Respuesta: Ejecutar en segundo plano Vb6

Si quieres leer el teclado desde cualquier sitio tienes que usar algo como GetAsyncKeyState.

Algo asi:

Con un timer...

Código vb:
Ver original
  1. Option Explicit
  2. Private Const constKeyDown = -32767
  3.  
  4. Const MOUSEEVENTF_MOVE = &H1 '  movimiento del mouse
  5. Const MOUSEEVENTF_LEFTDOWN = &H2 '  botón izquierdo presionado
  6. Const MOUSEEVENTF_LEFTUP = &H4 '  botón izquierdo soltado
  7. Const MOUSEEVENTF_RIGHTDOWN = &H8 '  botón derecho presionado
  8. Const MOUSEEVENTF_RIGHTUP = &H10 '  botón derecho soltado
  9. Const MOUSEEVENTF_MIDDLEDOWN = &H20 '  botón central presionado
  10. Const MOUSEEVENTF_MIDDLEUP = &H40 ' botón central soltado
  11. Const MOUSEEVENTF_ABSOLUTE = &H8000 '  movimiento absoluto
  12.  
  13. Private Type POINTAPI
  14.     X As Long
  15.     Y As Long
  16. End Type
  17.  
  18. Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
  19. Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
  20. Private Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
  21. Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
  22.  
  23. Private Sub Form_Load()
  24.   Timer1.Interval = 50
  25.   Timer1.Enabled = True
  26. End Sub
  27.  
  28. Private Sub Timer1_Timer()
  29.   Dim Point As POINTAPI
  30.   Static Levantar_L As Integer
  31.   Static Levantar_R As Integer
  32.  
  33.   If GetAsyncKeyState(40) <= constKeyDown Then
  34.     'MsgBox ("Abajo")
  35.    GetCursorPos Point
  36.     SetCursorPos Point.X, Point.Y + 10
  37.   End If
  38.  
  39.   If GetAsyncKeyState(38) <= constKeyDown Then
  40.     'MsgBox ("Arriba")
  41.    GetCursorPos Point
  42.     SetCursorPos Point.X, Point.Y - 10
  43.   End If
  44.  
  45.   If GetAsyncKeyState(37) <= constKeyDown Then
  46.     'MsgBox ("Izquierda")
  47.    GetCursorPos Point
  48.     SetCursorPos Point.X - 10, Point.Y
  49.   End If
  50.  
  51.   If GetAsyncKeyState(39) <= constKeyDown Then
  52.     'MsgBox ("Derecha")
  53.    GetCursorPos Point
  54.     SetCursorPos Point.X + 10, Point.Y
  55.   End If
  56.  
  57.   If GetAsyncKeyState(vbKeyZ) <= constKeyDown Then
  58.     If Levantar_L = 0 Then
  59.       mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_ABSOLUTE, 0, 0, 0, 0
  60.       Levantar_L = 1
  61.     End If
  62.   Else
  63.     If Levantar_L = 1 Then
  64.       mouse_event MOUSEEVENTF_LEFTUP Or MOUSEEVENTF_ABSOLUTE, 0, 0, 0, 0
  65.       Levantar_L = 0
  66.     End If
  67.     'MsgBox ("Z")
  68.  End If
  69.  
  70.   If GetAsyncKeyState(vbKeyX) = constKeyDown Then
  71.     If Levantar_R = 0 Then
  72.       mouse_event MOUSEEVENTF_RIGHTDOWN Or MOUSEEVENTF_ABSOLUTE, 0, 0, 0, 0
  73.       Levantar_R = 1
  74.     End If
  75.   Else
  76.     If Levantar_R = 1 Then
  77.       mouse_event MOUSEEVENTF_RIGHTUP Or MOUSEEVENTF_ABSOLUTE, 0, 0, 0, 0
  78.       Levantar_R = 0
  79.     End If
  80.     'MsgBox ("X")
  81.  End If
  82.  
  83. End Sub

Saludos

PD: Lo he editado para mejorarlo. Ahora funciona tambien en diagonal.
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!

Última edición por pkj; 18/06/2010 a las 02:58 Razón: Mejora del código
  #5 (permalink)  
Antiguo 17/06/2010, 20:42
Avatar de JuJoGuAl  
Fecha de Ingreso: julio-2009
Ubicación: Venezuela
Mensajes: 754
Antigüedad: 14 años, 8 meses
Puntos: 19
Respuesta: Ejecutar en segundo plano Vb6

Amigo no entiendes no quiero controlar el teclado solo el mouse con el teclado codigo que ya tengo lo que necesito ahora es que me corra en 2do plano es decir que aun q yo minize el programa puda seguir usandolo...
  #6 (permalink)  
Antiguo 17/06/2010, 20:53
Avatar de JuJoGuAl  
Fecha de Ingreso: julio-2009
Ubicación: Venezuela
Mensajes: 754
Antigüedad: 14 años, 8 meses
Puntos: 19
Respuesta: Ejecutar en segundo plano Vb6

Disculpa amigo estaba algo Cerrado =) jajajaja el programa funciona apesar de que esta minimizado, ahora como hago que al pasar el cursor sobre un icono lo pueda "clikear" con el enter u otra tecla?


Gracias y Disculpame lo grosero :(
  #7 (permalink)  
Antiguo 18/06/2010, 02:58
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 8 meses
Puntos: 29
Respuesta: Ejecutar en segundo plano Vb6

Todos cometemos errores.

He modificado el código para pulsar los botones con las teclas Z y X.

No funciona muy bien, ya que no mantiene pulsado el botón bien, pero es lo mejor que sé hacer.
Las teclas se pulsan además de mover el cursor, de modo que si pasas sobre el escritorio se seleccionan los iconos segun mueves el cursor, y si pasas sobre un texto se desplaza arriba o abajo, etc...

Tambien se bloquea si intentas pinchar en maximizar o minimizar el programa, aunque eso tambien me pasa a mi usando un gamepad en lugar de las teclas.
Tuve que añadir un boton "Minimizar" dentro del form.

Saludos.
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!
  #8 (permalink)  
Antiguo 18/06/2010, 08:06
Avatar de JuJoGuAl  
Fecha de Ingreso: julio-2009
Ubicación: Venezuela
Mensajes: 754
Antigüedad: 14 años, 8 meses
Puntos: 19
Respuesta: Ejecutar en segundo plano Vb6

Bueno amigo partiendo de tucodigo y algo que encontre en google este seria el Programa final:

Código vb:
Ver original
  1. Option Explicit
  2. Private Const constKeyDown = -32767
  3. Private Type POINTAPI
  4. X As Long
  5. Y As Long
  6. End Type
  7.  
  8. Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
  9. Private Const MOUSEEVENTF_LEFTDOWN = &H2
  10. Private Const MOUSEEVENTF_LEFTUP = &H4
  11. Private Const MOUSEEVENTF_MIDDLEDOWN = &H20
  12. Private Const MOUSEEVENTF_MIDDLEUP = &H40
  13. Private Const MOUSEEVENTF_MOVE = &H1
  14. Private Const MOUSEEVENTF_RIGHTDOWN = &H8
  15. Private Const MOUSEEVENTF_RIGHTUP = &H10
  16.  
  17. Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
  18. Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
  19. Private Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
  20.      
  21. Private Sub Form_Load()
  22. Timer1.Interval = 50
  23. Timer1.Enabled = True
  24. 'Me.Hide
  25. End Sub
  26.  
  27. Private Sub Timer1_Timer()
  28. Dim Point As POINTAPI
  29.          
  30. If GetAsyncKeyState(40) <= constKeyDown Then
  31. 'MsgBox ("Abajo")
  32. GetCursorPos Point
  33. SetCursorPos Point.X, Point.Y + 10
  34. End If
  35.        
  36. If GetAsyncKeyState(38) <= constKeyDown Then
  37. 'MsgBox ("Arriba")
  38. GetCursorPos Point
  39. SetCursorPos Point.X, Point.Y - 10
  40. End If
  41. If GetAsyncKeyState(37) <= constKeyDown Then
  42. 'MsgBox ("Izquierda")
  43. GetCursorPos Point
  44. SetCursorPos Point.X - 10, Point.Y
  45. End If
  46. If GetAsyncKeyState(39) <= constKeyDown Then
  47. 'MsgBox ("Derecha")
  48. GetCursorPos Point
  49. SetCursorPos Point.X + 10, Point.Y
  50. End If
  51. If GetAsyncKeyState(13) <= constKeyDown Then
  52. 'MsgBox ("Enter")
  53. mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
  54. mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
  55. End If
  56. If GetAsyncKeyState(32) <= constKeyDown Then
  57. 'MsgBox ("Espacio")
  58. mouse_event MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0
  59. mouse_event MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0
  60. End If
  61. End Sub
Lo unico que faltaria es hacerle Hide al Form para que quedara oculto...

o no se si habra una forma de que se coloque en la barra de tareas (como la Hora o los iconos del Antivirus..)

pero ya basicamente hace lo que buscaba..

Ah yo use ENTER y ESPACIO como CLIC y RightClic
  #9 (permalink)  
Antiguo 18/06/2010, 08:23
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 8 meses
Puntos: 29
Respuesta: Ejecutar en segundo plano Vb6

Espero que te sirva para lo que quieres.

El tema de colocar el icono en la barra de tareas está aquí:

http://www.forosdelweb.com/1044463-post55.html

Suerte.
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!
  #10 (permalink)  
Antiguo 18/06/2010, 09:03
Avatar de JuJoGuAl  
Fecha de Ingreso: julio-2009
Ubicación: Venezuela
Mensajes: 754
Antigüedad: 14 años, 8 meses
Puntos: 19
Respuesta: Ejecutar en segundo plano Vb6

Me sale Error de Compilacion (varaiable no Definida)

Me.PopupMenu MNU
  #11 (permalink)  
Antiguo 18/06/2010, 14:17
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 8 meses
Puntos: 29
Respuesta: Ejecutar en segundo plano Vb6

No lo he mirado bien, pero es diferente al que yo uso. Imagino que o quitas esa linea o deberas crear un menu llamado MNU (o como quieras si luego lo cambias en el código del ejemplo) con opciones, como p.ej. restaurar la ventana. Seguramente ese CASE se activa al pinchar el boton derecho sobre el icono.

Lo que pasa es que no te aclaran que significa cada valor del select case.

Usa mi mousemove como base

Código vb:
Ver original
  1. Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  2.   Const WM_LBUTTONDBLCLK = &H203
  3.   Const WM_LBUTTONDOWN = &H201
  4.   Const WM_LBUTTONUP = &H202
  5.   Const WM_RBUTTONDBLCLK = &H206
  6.   Const WM_RBUTTONDOWN = &H204
  7.   Const WM_RBUTTONUP = &H205
  8.  
  9.   Dim msg As Long
  10.  
  11.  
  12.   msg = X / Screen.TwipsPerPixelX
  13.  
  14.   Select Case msg
  15.      
  16.     Case WM_LBUTTONDBLCLK:
  17.     'Doble click izquierdo...
  18.    
  19.     Case WM_LBUTTONDOWN:
  20.     'Si pulsas el boton izquierdo...
  21.  
  22.  
  23.     Case WM_LBUTTONUP:
  24.     ' Si sueltas el boton izquierdo...
  25.  
  26.    
  27.     Case WM_RBUTTONDBLCLK:
  28.     ' etc...
  29.  
  30.    
  31.     Case WM_RBUTTONDOWN:
  32.     'Si pulsas el boton derecho...
  33.    ' Aqui puedes mostrar un menu desplegable con popupmenu.
  34.    ' Aunque en realidad puedes mostrarlo en el Case que quieras.
  35.    ' Incluso puedes elegir si lo muestras al pulsar o al soltar el boton que sea.
  36.  
  37.  
  38.     Case WM_RBUTTONUP:
  39.  
  40.   End Select
  41. End Sub
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!

Etiquetas: ejecutar, plano, vb
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:18.