如题,包括接收手柄按键信息及手柄事件处理等,我是初学者,能否详细一些,有源码最好。

解决方案 »

  1.   

    记不清楚了,还没用过这方面的东东。Direct的东东一般都是下面几步:
    1. 创建接口指针。
    2. 创建设备指针。
    3. 获取设备控制权。
    4. 在线程中不停地查询设备的状态。
      

  2.   


    不需要吧?游戏手柄一般都属于“通用”的外设。
    如果这都要厂商的“专用SDK”,估计它的手柄几乎卖不出去。
      

  3.   

    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