• Viernes 8 de Noviembre de 2024, 14:04

Autor Tema:  Duda Control Joystick VB.NET  (Leído 4247 veces)

gdonaire

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Duda Control Joystick VB.NET
« en: Miércoles 12 de Noviembre de 2008, 01:39 »
0
Hola a todos

Soy nuevo en el foro y tengo una duda sobre como controlar un Joystick con VB.NET, utilizo Microsoft Visual Basic 2008 Express Edition
El ejemplo esta sacado de otro enlace

He intentado adaptar este codigo a VB.NET, bueno estoy empezando pero me da errores.
A continuacion muestro la clase utilizada para manejar el jostick

Código: Text
  1.  
  2. Imports System.Runtime.InteropServices
  3.  
  4. Public Class joystick
  5.     ' Joystick API functions
  6.     Public Declare Function joyGetPosEx Lib "winmm.dll" (ByVal uJoyID As Long, ByRef pji As JOYINFOEX) As Long
  7.     Public Declare Function joyGetDevCapsA Lib "winmm.dll" (ByVal uJoyID As Long, ByRef pjc As JOYCAPS, ByVal cjc As Long) As Long
  8.     Public Declare Function joyGetNumDevs Lib "winmm.dll" () As Integer
  9.  
  10.  
  11.     <StructLayout(LayoutKind.Sequential)> _
  12.     Public Structure JOYCAPS
  13.         Dim wMid As Short
  14.         Dim wPid As Short
  15.         <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> _
  16.         Dim szPname As String
  17.         Dim wXmin As Integer
  18.         Dim wXmax As Integer
  19.         Dim wYmin As Integer
  20.         Dim wYmax As Integer
  21.         Dim wZmin As Integer
  22.         Dim wZmax As Integer
  23.         Dim wNumButtons As Integer
  24.         Dim wPeriodMin As Integer
  25.         Dim wPeriodMax As Integer
  26.         Dim wRmin As Integer
  27.         Dim wRmax As Integer
  28.         Dim wUmin As Integer
  29.         Dim wUmax As Integer
  30.         Dim wVmin As Integer
  31.         Dim wVmax As Integer
  32.         Dim wCaps As Integer
  33.         Dim wMaxAxes As Integer
  34.         Dim wNumAxes As Integer
  35.         Dim wMaxButtons As Integer
  36.         <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> _
  37.         Dim szRegKey As String
  38.         <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
  39.         Dim szOEMVxD As String
  40.     End Structure
  41.  
  42.     Public Structure JOYINFOEX
  43.         Dim dwSize As Integer
  44.         Dim dwFlags As Integer
  45.         Dim dwXpos As Integer
  46.         Dim dwYpos As Integer
  47.         Dim dwZpos As Integer
  48.         Dim dwRpos As Integer
  49.         Dim dwUpos As Integer
  50.         Dim dwVpos As Integer
  51.         Dim dwButtons As Integer
  52.         Dim dwButtonNumber As Integer
  53.         Dim dwPOV As Integer
  54.         Dim dwReserved1 As Integer
  55.         Dim dwReserved2 As Integer
  56.     End Structure
  57.  
  58.     Public MYJOYEX As JOYINFOEX
  59.     Public MYJOYCAPS As JOYCAPS
  60.  
  61.     Public Sub InitJoy()
  62.         'Get the joystick number in the system and about information
  63.         Dim xJa, xRj As Long
  64.         Dim xJn As Integer
  65.         xJa = joyGetNumDevs
  66.         Debug.Print("There are " & xJa & " joysticks")
  67.         Debug.Print("Longitud MYJOYCAPS: " & Len(MYJOYCAPS))
  68.         For xJn = 0 To xJa
  69.             Debug.Print(xJn)
  70.             xRj = joyGetDevCapsA(xJn, MYJOYCAPS, 404)
  71.  
  72.             If Val(MYJOYCAPS.wPid) <> 0 Then
  73.                 Debug.Print(MYJOYCAPS.wPid)
  74.            End If
  75.  
  76.         Next
  77.  
  78.     End Sub
  79. End Class
  80.  
  81.  

El problema es que cuando llamo al metodo InitJoy no me detecta ningun joystick (todos los wPid son cero).
No se si estoy realizando algo mal, agradeceria cualquier ayuda y/o comentario.

Gracias a todos.

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Duda Control Joystick VB.NET
« Respuesta #1 en: Miércoles 12 de Noviembre de 2008, 03:04 »
0
Hola.

Nunca he usado esas API, pero un vistazo rápido al visor de API, confirma mis sospechas... Te adjunto la declaración original de estas API y las estructuras para VB.6 que obviamente deben ser correctamente interpretadas para vb > 6.0

Código: Visual Basic
  1.  
  2. Public Declare Function joyGetPosEx Lib "winmm.dll" Alias "joyGetPosEx" (ByVal uJoyID As Long, pji As JOYINFOEX) As Long
  3. Public Declare Function joyGetDevCaps Lib "winmm.dll" Alias "joyGetDevCapsA" (ByVal id As Long, lpCaps As JOYCAPS, ByVal uSize As Long) As Long
  4. Public Type JOYCAPS
  5.         wMid As Integer
  6.         wPid As Integer
  7.         szPname As String * MAXPNAMELEN
  8.         wXmin As Integer
  9.         wXmax As Integer
  10.         wYmin As Integer
  11.         wYmax As Integer
  12.         wZmin As Integer
  13.         wZmax As Integer
  14.         wNumButtons As Integer
  15.         wPeriodMin As Integer
  16.         wPeriodMax As Integer
  17. End Type
  18. Public Type JOYINFOEX
  19.         dwSize As Long                 '  tamaño de la estructura
  20.        dwFlags As Long                '  indicadores de lo que hay que devolver
  21.        dwXpos As Long                 '  posición x
  22.        dwYpos As Long                 '  posición y
  23.        dwZpos As Long                 '  posición z
  24.        dwRpos As Long                 '  timón/posición del 4º eje
  25.        dwUpos As Long                 '  posición del 5º eje
  26.        dwVpos As Long                 '  posición del 6º eje
  27.        dwButtons As Long              '  estado de los botones
  28.        dwButtonNumber As Long         '  número del botón que está presionado ahora
  29.        dwPOV As Long                  '  estado del punto de vista
  30.        dwReserved1 As Long            '  reservado para la comunicación del controlador winmm
  31.        dwReserved2 As Long            '  reservado para expansión futura
  32. End Type
  33.  
  34.  
  35.  

Como puedes ver , debes cambiar los tipos de datos originales, un long en vb6.0 es un integer (int32) en vb2008.
Haz también las correcciones pertienentes en la sub InitJoy (xJa, xRj deben declarase como integer visto la devolución de las API).

luego yo haría los siguientes cambios:
Código: Visual Basic
  1.  
  2.     ' cambiaría esto:
  3.     Public MYJOYCAPS As JOYCAPS
  4.  
  5.     ' por esto
  6.     Public MYJOYCAPS() As JOYCAPS
  7.  
  8.     ' esto:
  9.     xJa = joyGetNumDevs
  10.    ' por esto:
  11.     xJa = joyGetNumDevs - 1
  12.     ReDim MYJOYCAPS(0 To xJa)
  13.  
  14.     ' esto:
  15.     Dim xJn As Integer
  16.  
  17.    Debug.Print("Longitud MYJOYCAPS: " & Len(MYJOYCAPS))
  18.     For xJn = 0 To xJa
  19.          Debug.Print(xJn)
  20.          xRj = joyGetDevCapsA(xJn, MYJOYCAPS, 404)
  21.              If Val(MYJOYCAPS.wPid) <> 0 Then
  22.                 Debug.Print(MYJOYCAPS.wPid)
  23.              End If
  24.     Next
  25.  
  26.     ' por esto, añadiendo un bloque try ... catch:
  27.     Dim n As Integer
  28.  
  29.     Debug.Print("Longitud MYJOYCAPS(0): " & Len(MYJOYCAPS(0)))
  30.     n = -1
  31.     Do While n < (xJa - 1)
  32.         n = n + 1
  33.         Debug.Print(n)
  34.         Try
  35.             xRj = joyGetDevCapsA(n, MYJOYCAPS(n), 404)
  36.                If MYJOYCAPS(n).wPid <> 0 Then
  37.                 Debug.Print(MYJOYCAPS(n).wPid)
  38.              End If
  39.  
  40.         catch
  41.              msgbox err.Description
  42.         Finally
  43.            '.
  44.     Loop
  45.  
  46.  
  47.  

Yo no tengo Joysticks así que no puedo probarlo...
Una vez que arregles ese desaguisado de los tipos de datos, si tienes más problemas vuelve a preguntar con el error devuelto
«Ma non troppo»
----> ModoVacaciones = False<----

gdonaire

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Duda Control Joystick VB.NET
« Respuesta #2 en: Miércoles 12 de Noviembre de 2008, 23:30 »
0
Hola Nebire

Gracias por tus aclaraciones, siguiendo algunas indicaciones tuyas he cambiado los prototipos de las importaciones de DLL ya que eran erroneas.
Ahora el codigo funciona y me devuelve la informacion sobre el joystick conectado.

Código: Text
  1. Imports System.Runtime.InteropServices
  2.  
  3. Public Class joystick
  4.     ' Joystick API functions
  5.     Private Declare Function joyGetPosEx Lib "winmm.dll" (ByVal uJoyID As Integer, ByRef pji As JOYINFOEX) As Integer
  6.     Private Declare Function joyGetDevCaps Lib "winmm.dll" Alias "joyGetDevCapsA" (ByVal uJoyID As Integer, ByRef pjc As JOYCAPS, ByVal cjc As Integer) As Integer
  7.     Private Declare Function joyGetNumDevs Lib "winmm.dll" () As Integer
  8.  
  9.     <StructLayout(LayoutKind.Sequential)> _
  10.     Public Structure JOYCAPS
  11.         Dim wMid As Short
  12.         Dim wPid As Short
  13.         <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> _
  14.         Dim szPname As String
  15.         Dim wXmin As Integer
  16.         Dim wXmax As Integer
  17.         Dim wYmin As Integer
  18.         Dim wYmax As Integer
  19.         Dim wZmin As Integer
  20.         Dim wZmax As Integer
  21.         Dim wNumButtons As Integer
  22.         Dim wPeriodMin As Integer
  23.         Dim wPeriodMax As Integer
  24.         Dim wRmin As Integer
  25.         Dim wRmax As Integer
  26.         Dim wUmin As Integer
  27.         Dim wUmax As Integer
  28.         Dim wVmin As Integer
  29.         Dim wVmax As Integer
  30.         Dim wCaps As Integer
  31.         Dim wMaxAxes As Integer
  32.         Dim wNumAxes As Integer
  33.         Dim wMaxButtons As Integer
  34.         <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> _
  35.         Dim szRegKey As String
  36.         <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
  37.         Dim szOEMVxD As String
  38.     End Structure
  39.  
  40.     Public Structure JOYINFOEX
  41.         Dim dwSize As Integer
  42.         Dim dwFlags As Integer
  43.         Dim dwXpos As Integer
  44.         Dim dwYpos As Integer
  45.         Dim dwZpos As Integer
  46.         Dim dwRpos As Integer
  47.         Dim dwUpos As Integer
  48.         Dim dwVpos As Integer
  49.         Dim dwButtons As Integer
  50.         Dim dwButtonNumber As Integer
  51.         Dim dwPOV As Integer
  52.         Dim dwReserved1 As Integer
  53.         Dim dwReserved2 As Integer
  54.     End Structure
  55.  
  56.     '***  joyGetPosEx  Constants  ***
  57.  
  58.     Public Const JOYSTICKID1 = 0
  59.     Public Const JOYSTICKID2 = 1
  60.     Public Const MMSYSERR_BASE = 0
  61.     ' The joystick driver is not present.
  62.     Public Const MMSYSERR_NODRIVER = (MMSYSERR_BASE + 6)
  63.     ' An invalid parameter was passed.
  64.     Public Const MMSYSERR_INVALPARAM = (MMSYSERR_BASE + 11)
  65.     ' Windows 95/98/Me: The specified joystick identifier is invalid.
  66.     Public Const MMSYSERR_BADDEVICEID = (MMSYSERR_BASE + 2)
  67.     Public Const JOYERR_NOERROR = 0
  68.     'if successful or one of the following error values.
  69.     Public Const JOYERR_BASE = 160
  70.     ' Windows NT/2000/XP: The specified joystick identifier is invalid.
  71.     Public Const JOYERR_PARMS = (JOYERR_BASE + 5)
  72.     ' The specified joystick is not connected to the system.
  73.     Public Const JOYERR_UNPLUGGED = (JOYERR_BASE + 7)
  74.  
  75.     Public JoyNum As Long
  76.     Private JoyInfoExtended As JOYINFOEX
  77.     Public MYJOYEX As JOYINFOEX
  78.  
  79.      Public Sub InitJoy()
  80.         'Get the joystick number in the system and about information
  81.         Dim xJa, xRj As Long
  82.         Dim xJn As Integer
  83.         Dim sDJ As String
  84.         Dim CapX As JOYCAPS
  85.  
  86.         xJa = joyGetNumDevs
  87.         ' The joyGetNumDevs function returns the number of joysticks supported by the
  88.         ' current driver or zero if no driver is installed.
  89.         If (xJa = 0) Then
  90.             MsgBox("There is no joystick driver installed.", MsgBoxStyle.Critical)
  91.         End If
  92.         Debug.Print("There are " & xJa & " joysticks")
  93.         For xJn = 0 To (xJa - 1)
  94.             Debug.Print(xJn)
  95.             xRj = joyGetDevCaps(xJn, CapX, 404)
  96.             Select Case xRj
  97.                 Case MMSYSERR_NODRIVER
  98.                     'The joystick driver is not present or joystick identifier is invalid
  99.                     MsgBox("The joystick driver is not present or joystick identifier is invalid", MsgBoxStyle.Critical)
  100.                 Case MMSYSERR_INVALPARAM
  101.                     ' An invalid parameter was passed or joystick identifier is invalid
  102.                     MsgBox("An invalid parameter was passed or joystick identifier is invalid", MsgBoxStyle.Critical)
  103.                 Case Else
  104.                     ' default
  105.             End Select
  106.  
  107.             If Val(CapX.wPid) <> 0 Then
  108.                 sDJ = "Joystick " & Trim(Str(xJn + 1))
  109.                 sDJ &= Str(CapX.wNumAxes) & " Axes"
  110.                 sDJ &= Str(CapX.wNumButtons) & " Buttons "
  111.                 sDJ &= CapX.szPname
  112.                 Debug.Print(sDJ)
  113.             End If
  114.         Next
  115.     End Sub
  116.    End Class
  117.  
  118.  

Gracias por la ayuda.

Saludos

cristian said

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Duda Control Joystick VB.NET
« Respuesta #3 en: Martes 6 de Enero de 2009, 23:42 »
0
hola amigo puedes montar ese codigo ya funcionando en vb.net para mirarlo te agradeceria