首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

怎样用VB.NET取得游戏手柄按键的键值(北通手柄)

2012-12-14 
怎样用VB.NET获得游戏手柄按键的键值(北通手柄)我想实现游戏手柄上按那一个键,软件上要显示出来。[解决办法

怎样用VB.NET获得游戏手柄按键的键值(北通手柄)
我想实现游戏手柄上按那一个键,软件上要显示出来。
[解决办法]
查看DirectX文档
[解决办法]


Option Strict Off
Option Explicit On
Public Class Form1
 
    Dim oDX As New DxVBLibA.DirectX8
    Dim oDI As DxVBLibA.DirectInput8
    Dim oDID As DxVBLibA.DirectInputDevice8
    Dim oDIED As DxVBLibA.DirectInputEnumDevices8
    Dim EventHandle As Integer
    Dim oDIDC As DxVBLibA.DIDEVCAPS
    Dim oDIJS As DxVBLibA.DIJOYSTATE
    Dim oDIProp_Dead As DxVBLibA.DIPROPLONG
    Dim oDIProp_Range As DxVBLibA.DIPROPRANGE
    Dim oDIProp_Saturation As DxVBLibA.DIPROPLONG
    Dim IsAxisPresent(2) As Boolean
    Dim Running As Boolean
    Sub init()
        oDI = oDX.DirectInputCreate()
        oDIED = oDI.GetDIDevices(DxVBLibA.CONST_DI8DEVICETYPE.DI8DEVCLASS_GAMECTRL, DxVBLibA.CONST_DIENUMDEVICESFLAGS.DIEDFL_ATTACHEDONLY)

        If oDIED.GetCount = 0 Then
            MsgBox("NO JOY")
            Me.Close()
        End If
        ' EventHandle = oDX.CreateEvent(Me)
        Exit Sub
Error_Out:
        MsgBox("there was a problem initializing directinput.")
        Me.Close()

    End Sub
  

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Running = True
        init()
    End Sub

    Private Sub cmdGetJoystick_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdGetJoystick.Click
        getjoystick()

    End Sub
    Private Sub DirectxEvent8_DXCallback(ByVal eventid As Long)
        Dim i As Integer
        If oDID Is Nothing Then Exit Sub
        On Error Resume Next
        oDID.GetDeviceStateJoystick(oDIJS)

        If Err.Number = DxVBLibA.CONST_DINPUTERR.DIERR_NOTACQUIRED Or Err.Number = DxVBLibA.CONST_DINPUTERR.DIERR_INPUTLOST Then
            oDID.Acquire()
            Exit Sub


        End If
        For i = 0 To 1
            If Me.IsAxisPresent(i) Then
                Select Case i
                    Case 1
                        If Me.oDIJS.x < 5000 Then
                            Me.Panel1.Left = Me.Panel1.Left - 50
                        ElseIf Me.oDIJS.x > 5000 Then
                            Me.Panel1.Left = Me.Panel1.Left + 50

                        End If
                    Case 2
                        If Me.oDIJS.y < 5000 Then
                            Me.Panel1.Top = Me.Panel1.Top - 50
                        ElseIf Me.oDIJS.y > 5000 Then
                            Me.Panel1.Top = Me.Panel1.Top + 50

                        End If
                End Select

            End If
        Next
        Exit Sub
err_DXCallBack:
        MsgBox(Err.Description & " : " & Err.Number, MsgBoxStyle.ApplicationModal)
    End Sub
    Private Sub GetJoystick()
        On Error Resume Next
        If Not oDID Is Nothing Then
            oDID.Unacquire()

        End If
        oDID = Nothing
        oDID = oDI.CreateDevice(oDIED.GetItem(1).GetGuidInstance)
        oDID.SetCommonDataFormat(DxVBLibA.CONST_DICOMMONDATAFORMATS.DIFORMAT_JOYSTICK)
        oDID.SetCooperativeLevel(Me.Handle.ToInt32, DxVBLibA.CONST_DISCLFLAGS.DISCL_FOREGROUND Or DxVBLibA.CONST_DISCLFLAGS.DISCL_NONEXCLUSIVE)


        oDID.GetCapabilities(oDIDC)
        GetAxes(oDID)
        Call oDID.SetEventNotification(EventHandle)
        With oDIProp_Dead
            .lData = 1000
            .lHow = DxVBLibA.CONST_DIPHFLAGS.DIPH_BYOFFSET
            .lObj = DxVBLibA.CONST_DIJOYSTICKOFS.DIJOFS_X
            oDID.SetProperty("DIPROP_DEADZONE", oDIProp_Dead.lObj)
            .lObj = DxVBLibA.CONST_DIJOYSTICKOFS.DIJOFS_Y
            oDID.SetProperty("DIPROP_DEADZONE", oDIProp_Dead.lObj)
        End With
        With oDIProp_Saturation
            .lData = 9500
            .lHow = DxVBLibA.CONST_DIPHFLAGS.DIPH_BYOFFSET

            .lObj = DxVBLibA.CONST_DIJOYSTICKOFS.DIJOFS_X
            oDID.SetProperty("DIPROP_SATURATION", oDIProp_Saturation.lObj)
            .lObj = DxVBLibA.CONST_DIJOYSTICKOFS.DIJOFS_Y
            oDID.SetProperty("DIPROP_SATURATION", oDIProp_Saturation.lObj)
        End With
        On Error Resume Next
        With oDIProp_Range
            .lHow = DxVBLibA.CONST_DIPHFLAGS.DIPH_DEVICE
            .lMin = 0
            .lMax = 10000
        End With
        oDID.Acquire()
        DirectxEvent8_DXCallback(0)
        While Running = True
            System.Windows.Forms.Application.DoEvents()
            oDID.Poll()
        End While
    End Sub
    Sub GetAxes(ByVal oDID As DxVBLibA.DirectInputDevice8)
        Dim oDIEDO As DxVBLibA.DirectInputEnumDeviceObjects
        Dim oDIDOI As DxVBLibA.DirectInputDeviceObjectInstance
        Dim I As Integer
        For I = 0 To 1
            IsAxisPresent(I) = False

        Next
        oDIEDO = oDID.GetDeviceObjectsEnum(DxVBLibA.CONST_DIDFTFLAGS.DIDFT_AXIS)


        Dim SGUID As String
        For I = 0 To oDIEDO.GetCount
            oDIDOI = oDIEDO.GetItem(1)
            SGUID = oDIDOI.GetGuidType
            Select Case SGUID
                Case "GUID_XAxis"
                    IsAxisPresent(1) = True
                Case "GUID_YAxis"
                    IsAxisPresent(2) = True
            End Select
        Next
    End Sub

End Class




以上代码能检测到手柄,单一采集数据就不行。不知是什么原因。
[解决办法]
望哪位能帮忙一下,我就卡在这里了,搞定后,小辈以全新北通BTP-2188薄礼答谢,不成敬意。在线等,拜托拜托了。
[解决办法]
试过WINIO没?
[解决办法]
问题解决了么,我也想要这个代码

热点排行