Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: MandingoPC en 18 Diciembre 2011, 00:59 am



Título: Reproducir sonido en evento MouseMOve, pero que no sea eterno
Publicado por: MandingoPC en 18 Diciembre 2011, 00:59 am
Reproduzco sonido con el iResult = mciExecute al pasar el raton sobre un boton. Obviamente es un sonido muy corto. EL problema es q la más mínima pulsacion q haga sobre el boton, vuelve a sonar. Por ende si sigo desplasando x otros botones se traba y no suena, y luego suea todo junto.

Hay algfuna forma de que cuando ya estoy sobre un elemento, no suene más hasta que lo abandone, y luego suene de nuevo cuando lo paso de nuevo x ese elmento?


Título: Re: Reproducir sonido en evento MouseMOve, pero que no sea eterno
Publicado por: Sanlegas en 18 Diciembre 2011, 03:21 am
Usa banderas, con una variable global tipo boolean

Dim Flag As Boolean

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

if Not Flag then
      Flag = True
      ReproduceSonido ' La funcion para reproducir el sonido
      Flag = False
end if

End Sub

Salu2 !


Título: Re: Reproducir sonido en evento MouseMOve, pero que no sea eterno
Publicado por: BlackZeroX en 18 Diciembre 2011, 07:27 am
Si es solo una vez en cada momento que el mouse este en la VENTANA que deseas, es decir:

* Supongamos que tienes 1 Form y dentro tienes un PictureBox, y la situacion deseada seria:
-> Moverse en el form No reproducir sonido.
-> Moverse sobre el PictureBox solo reproducir 1 sola vez, sin importar cuantas veces se mueva el mouse...

(*Recomiendo por que no se usa demasiado el procesador):
***Si es esto lo que deseas, nesesitaras hacer un HOOK al mouse a nivel Theard Local...

(-No recomendado, ya que de esta manera se usa demasiado el procesador):
***Tambien puedes implementar el procedimiento con un Timer... algo asi:

Aquí te dejo mas o menos el codigo (Si tiene alguna falla es por que lo hice aqui en el foro):

Código
  1.  
  2. Option Explicit
  3.  
  4. Private Type POINTAPI
  5.    x                                       As Long
  6.    y                                       As Long
  7. End Type
  8.  
  9. Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
  10. Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
  11.  
  12. Private hWinLastMouseMove As Long
  13. Private hWinActivateSound As Long
  14.  
  15. Private Sub Form_Load()
  16.    hWinActivateSound = Picture1.hWnd
  17.    Timer1.Interval = 100
  18.    Timer1.Enabled = True
  19. End Sub
  20.  
  21. Private Function getCurrentWindowFromMousePoint() As Long
  22. Dim udtMousePoint As POINTAPI
  23.    GetCursorPos udtMousePoint
  24.    getCurrentWindowFromMousePoint = WindowFromPoint(udtMousePoint.x, udtMousePoint.y)
  25. End Function
  26.  
  27. Private Sub playMySound()
  28.    Beep
  29. End Sub
  30.  
  31. Private Sub Timer1_Timer()
  32. Dim hWinNow As Long
  33.    hWinNow = getCurrentWindowFromMousePoint
  34.    If (hWinLastMouseMove = hWinNow) Then Exit Sub
  35.    hWinLastMouseMove = hWinNow
  36.    If Not (hWinActivateSound = hWinNow) Then Exit Sub
  37.    Call playMySound
  38. End Sub
  39.  
  40.  

Dulces Lunas!¡.


Título: Re: Reproducir sonido en evento MouseMOve, pero que no sea eterno
Publicado por: MandingoPC en 18 Diciembre 2011, 07:39 am
BlackZeroX (Astaroth), Dios es una infernalidad de código, ya que pensaba hcerlo a mas o menos 25 botones omg. Pero funciona, ya veré que hacer para q ande en los 25 botones. NO creo q tenga q copuiar y pegar eso 25 veces, lo anlizaré bien yveré como es, gracias.

Tenient101, el código no funcona. Osea hace lo mismo, no para de reproducir si se sigue moviendo el mouse sobre el objeto. El sonido se reproduce siepre.


Título: Re: Reproducir sonido en evento MouseMOve, pero que no sea eterno
Publicado por: BlackZeroX en 18 Diciembre 2011, 09:28 am
Pista:
Usa For Next y sustituye la variable hWinActivateSound  por un array... en el timer solo recorrelo... (Solo si son ventanas espesificas), pero de lo contrario si es un CONJUNTO de ventanas de una familia X, por ejemplo, TODOS los CommandButton de un form (fom.controls) realiza un For Each a la clase controls verificando si es un CommandButton (  if control is CommandButton then ...)... en este ultimo no veo la necesidad de crear un array... en todo debes comparar un Handle anterior para que no suenen mas de 1 vez enc ada ocación...

Dulces Lunas!¡.