DX的我就不是很清楚了,但API的我搞过,这是我以前搞的一个用API实现游戏手柄的测试程序,你可以看看。 如果要搞DX的,建议下载DX的SDK,里面有范例的,以下是我用API搞的程序代码。 Private Enum 主副机类型 主机 = 0 副机 = 1 End Enum Private 主副机 As 主副机类型 Private Declare Function joyGetPosEx Lib "winmm.dll" (ByVal uJoyID As Long, pji As JOYINFOEX) As Long Private Declare Function joyReleaseCapture Lib "winmm.dll" (ByVal id As Long) As Long Private Declare Function joySetCapture Lib "winmm.dll" (ByVal hWnd As Long, ByVal uID As Long, ByVal uPeriod As Long, ByVal bChanged As Long) As Long Private Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As LongPrivate Const JOYSTICKID1 = 0 Private Const JOYSTICKID2 = 1Private Const JOY_POVCENTERED = -1 Private Const JOY_POVFORWARD = 0 Private Const JOY_POVRIGHT = 9000 Private Const JOY_POVLEFT = 27000 Private Const JOY_RETURNX = &H1& Private Const JOY_RETURNY = &H2& Private Const JOY_RETURNZ = &H4& Private Const JOY_RETURNR = &H8& Private Const JOY_RETURNU = &H10 Private Const JOY_RETURNV = &H20 Private Const JOY_RETURNPOV = &H40& Private Const JOY_RETURNBUTTONS = &H80& Private Const JOY_RETURNRAWDATA = &H100& Private Const JOY_RETURNPOVCTS = &H200& Private Const JOY_RETURNCENTERED = &H400& Private Const JOY_USEDEADZONE = &H800& Private Const JOY_RETURNALL = (JOY_RETURNX Or JOY_RETURNY Or JOY_RETURNZ Or JOY_RETURNR Or JOY_RETURNU Or JOY_RETURNV Or JOY_RETURNPOV Or JOY_RETURNBUTTONS) Private Const JOY_CAL_READALWAYS = &H10000 Private Const JOY_CAL_READRONLY = &H2000000 Private Const JOY_CAL_READ3 = &H40000 Private Const JOY_CAL_READ4 = &H80000 Private Const JOY_CAL_READXONLY = &H100000 Private Const JOY_CAL_READYONLY = &H200000 Private Const JOY_CAL_READ5 = &H400000 Private Const JOY_CAL_READ6 = &H800000 Private Const JOY_CAL_READZONLY = &H1000000 Private Const JOY_CAL_READUONLY = &H4000000 Private Const JOY_CAL_READVONLY = &H8000000' Declare necessary API data structure. THIS I know is necessary. Private Type JOYINFOEX dwSize As Long ' size of structure dwFlags As Long ' flags to indicate what to return dwXpos As Long ' x position dwYpos As Long ' y position dwZpos As Long ' z position dwRpos As Long ' rudder/4th axis position dwUpos As Long ' 5th axis position dwVpos As Long ' 6th axis position dwButtons As Long ' button states dwButtonNumber As Long ' current button number pressed dwPOV As Long ' point of view state dwReserved1 As Long ' reserved for communication between winmm driver dwReserved2 As Long ' reserved for future expansion End TypeDim 游戏手柄 As JOYINFOEX Dim 保存方向 As Long Dim 当前方向 As LongPrivate Sub Form_Load() 主副机 = 主机 joySetCapture Me.hWnd, 主副机, 1, 0 joyReleaseCapture 主副机 joyGetPosEx 主副机, 游戏手柄 End SubPrivate Sub Timer1_Timer() 游戏手柄.dwSize = 64 游戏手柄.dwFlags = JOY_RETURNALL
' Get the joystick coordinates. joyGetPosEx 主副机, 游戏手柄 If 游戏手柄.dwButtons > 0 Then Label1.Caption = 游戏手柄.dwButtons Else If Label1.Caption <> "(无)" Then Label1.Caption = "(无)" End If If 游戏手柄.dwRpos = 32767 And 游戏手柄.dwZpos = 32767 Then If 游戏手柄.dwXpos = 0 And 游戏手柄.dwYpos = 0 Then '左上方向 当前方向 = 0 ElseIf 游戏手柄.dwXpos = 32767 And 游戏手柄.dwYpos = 0 Then '上方向 当前方向 = 1 ElseIf 游戏手柄.dwXpos = 65535 And 游戏手柄.dwYpos = 0 Then '右上方向 当前方向 = 2 ElseIf 游戏手柄.dwXpos = 0 And 游戏手柄.dwYpos = 32767 Then '左方向 当前方向 = 3 ElseIf 游戏手柄.dwXpos = 32767 And 游戏手柄.dwYpos = 32767 Then '没有方向 当前方向 = 4 ElseIf 游戏手柄.dwXpos = 65535 And 游戏手柄.dwYpos = 32767 Then '右方向 当前方向 = 5 ElseIf 游戏手柄.dwXpos = 0 And 游戏手柄.dwYpos = 65535 Then '左下方向 当前方向 = 6 ElseIf 游戏手柄.dwXpos = 32767 And 游戏手柄.dwYpos = 65535 Then '下方向 当前方向 = 7 ElseIf 游戏手柄.dwXpos = 65535 And 游戏手柄.dwYpos = 65535 Then '右下方向 当前方向 = 8 End If Else End If If 保存方向 <> 当前方向 Then Picture1.Item(保存方向).BackColor = 0 Picture1.Item(当前方向).BackColor = 255 保存方向 = 当前方向 End If Text1.Text = 游戏手柄.dwXpos Text2.Text = 游戏手柄.dwYpos Label5.Caption = 游戏手柄.dwRpos Label6.Caption = 游戏手柄.dwZpos End Sub
1. 创建接口指针。
2. 创建设备指针。
3. 获取设备控制权。
4. 在线程中不停地查询设备的状态。
不需要吧?游戏手柄一般都属于“通用”的外设。
如果这都要厂商的“专用SDK”,估计它的手柄几乎卖不出去。
如果要搞DX的,建议下载DX的SDK,里面有范例的,以下是我用API搞的程序代码。
Private Enum 主副机类型
主机 = 0
副机 = 1
End Enum
Private 主副机 As 主副机类型
Private Declare Function joyGetPosEx Lib "winmm.dll" (ByVal uJoyID As Long, pji As JOYINFOEX) As Long
Private Declare Function joyReleaseCapture Lib "winmm.dll" (ByVal id As Long) As Long
Private Declare Function joySetCapture Lib "winmm.dll" (ByVal hWnd As Long, ByVal uID As Long, ByVal uPeriod As Long, ByVal bChanged As Long) As Long
Private Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As LongPrivate Const JOYSTICKID1 = 0
Private Const JOYSTICKID2 = 1Private Const JOY_POVCENTERED = -1
Private Const JOY_POVFORWARD = 0
Private Const JOY_POVRIGHT = 9000
Private Const JOY_POVLEFT = 27000
Private Const JOY_RETURNX = &H1&
Private Const JOY_RETURNY = &H2&
Private Const JOY_RETURNZ = &H4&
Private Const JOY_RETURNR = &H8&
Private Const JOY_RETURNU = &H10
Private Const JOY_RETURNV = &H20
Private Const JOY_RETURNPOV = &H40&
Private Const JOY_RETURNBUTTONS = &H80&
Private Const JOY_RETURNRAWDATA = &H100&
Private Const JOY_RETURNPOVCTS = &H200&
Private Const JOY_RETURNCENTERED = &H400&
Private Const JOY_USEDEADZONE = &H800&
Private Const JOY_RETURNALL = (JOY_RETURNX Or JOY_RETURNY Or JOY_RETURNZ Or JOY_RETURNR Or JOY_RETURNU Or JOY_RETURNV Or JOY_RETURNPOV Or JOY_RETURNBUTTONS)
Private Const JOY_CAL_READALWAYS = &H10000
Private Const JOY_CAL_READRONLY = &H2000000
Private Const JOY_CAL_READ3 = &H40000
Private Const JOY_CAL_READ4 = &H80000
Private Const JOY_CAL_READXONLY = &H100000
Private Const JOY_CAL_READYONLY = &H200000
Private Const JOY_CAL_READ5 = &H400000
Private Const JOY_CAL_READ6 = &H800000
Private Const JOY_CAL_READZONLY = &H1000000
Private Const JOY_CAL_READUONLY = &H4000000
Private Const JOY_CAL_READVONLY = &H8000000' Declare necessary API data structure. THIS I know is necessary.
Private Type JOYINFOEX
dwSize As Long ' size of structure
dwFlags As Long ' flags to indicate what to return
dwXpos As Long ' x position
dwYpos As Long ' y position
dwZpos As Long ' z position
dwRpos As Long ' rudder/4th axis position
dwUpos As Long ' 5th axis position
dwVpos As Long ' 6th axis position
dwButtons As Long ' button states
dwButtonNumber As Long ' current button number pressed
dwPOV As Long ' point of view state
dwReserved1 As Long ' reserved for communication between winmm driver
dwReserved2 As Long ' reserved for future expansion
End TypeDim 游戏手柄 As JOYINFOEX
Dim 保存方向 As Long
Dim 当前方向 As LongPrivate Sub Form_Load()
主副机 = 主机
joySetCapture Me.hWnd, 主副机, 1, 0
joyReleaseCapture 主副机
joyGetPosEx 主副机, 游戏手柄
End SubPrivate Sub Timer1_Timer()
游戏手柄.dwSize = 64
游戏手柄.dwFlags = JOY_RETURNALL
' Get the joystick coordinates.
joyGetPosEx 主副机, 游戏手柄
If 游戏手柄.dwButtons > 0 Then
Label1.Caption = 游戏手柄.dwButtons
Else
If Label1.Caption <> "(无)" Then Label1.Caption = "(无)"
End If
If 游戏手柄.dwRpos = 32767 And 游戏手柄.dwZpos = 32767 Then
If 游戏手柄.dwXpos = 0 And 游戏手柄.dwYpos = 0 Then
'左上方向
当前方向 = 0
ElseIf 游戏手柄.dwXpos = 32767 And 游戏手柄.dwYpos = 0 Then
'上方向
当前方向 = 1
ElseIf 游戏手柄.dwXpos = 65535 And 游戏手柄.dwYpos = 0 Then
'右上方向
当前方向 = 2
ElseIf 游戏手柄.dwXpos = 0 And 游戏手柄.dwYpos = 32767 Then
'左方向
当前方向 = 3
ElseIf 游戏手柄.dwXpos = 32767 And 游戏手柄.dwYpos = 32767 Then
'没有方向
当前方向 = 4
ElseIf 游戏手柄.dwXpos = 65535 And 游戏手柄.dwYpos = 32767 Then
'右方向
当前方向 = 5
ElseIf 游戏手柄.dwXpos = 0 And 游戏手柄.dwYpos = 65535 Then
'左下方向
当前方向 = 6
ElseIf 游戏手柄.dwXpos = 32767 And 游戏手柄.dwYpos = 65535 Then
'下方向
当前方向 = 7
ElseIf 游戏手柄.dwXpos = 65535 And 游戏手柄.dwYpos = 65535 Then
'右下方向
当前方向 = 8
End If
Else
End If
If 保存方向 <> 当前方向 Then
Picture1.Item(保存方向).BackColor = 0
Picture1.Item(当前方向).BackColor = 255
保存方向 = 当前方向
End If
Text1.Text = 游戏手柄.dwXpos
Text2.Text = 游戏手柄.dwYpos
Label5.Caption = 游戏手柄.dwRpos
Label6.Caption = 游戏手柄.dwZpos
End Sub