怎样用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没?
[解决办法]
问题解决了么,我也想要这个代码