获取游戏手柄的按键输入

原创 2004年03月03日 11:42:00

//可以查看按游戏手柄按钮时的情况.

//USB接口的游戏手柄

//编译环境:Windows 2000 server+VC++ 6.0+Win2K DDK

#include <stdio.h>
#include <windows.h>
#include <setupapi.h>
#include <tchar.h>
extern "C"
{
#include <hidsdi.h>
}

void main()
{
 GUID HidGuid;

 // 查找本系统中HID类的GUID标识
 HidD_GetHidGuid(&HidGuid);
 _tprintf("系统中HID类的GUID标识为:%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x/n",
   HidGuid.Data1,HidGuid.Data2 ,HidGuid.Data3 ,
   HidGuid.Data4[0],HidGuid.Data4[1],HidGuid.Data4[2],
   HidGuid.Data4[3],HidGuid.Data4[4],HidGuid.Data4[5],
   HidGuid.Data4[6],HidGuid.Data4[7]);
 
 // 准备查找符合HID规范的USB设备
 HDEVINFO hDevInfo = SetupDiGetClassDevs(&HidGuid,
           NULL,
           NULL,
           DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
 if (hDevInfo == INVALID_HANDLE_VALUE)
 {
  _tprintf("符合HID规范的USB设备发生错误/n");
  return;
 }

 _tprintf("正在查找可用的USB设备.../n");

 DWORD MemberIndex = 0;
 SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
 BOOL bSuccess = FALSE;

 DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
 do
 {
  bSuccess = SetupDiEnumDeviceInterfaces(hDevInfo,
             NULL,
             &HidGuid,
             MemberIndex,
             &DeviceInterfaceData);
  if ((!bSuccess) && (GetLastError() == ERROR_NO_MORE_ITEMS))
  {
   if(MemberIndex == 0)
    _tprintf("抱歉,未找到可用的USB设备!/n");
   else
    _tprintf("没有更多的可用的USB设备!/n");

   SetupDiDestroyDeviceInfoList(hDevInfo);
   return;
  }
  _tprintf("找到了一个USB设备:/n");
  //若找到了一个USB设备,则获取该设备的细节信息
  PSP_DEVICE_INTERFACE_DETAIL_DATA pDeviceInterfaceDetailData;
  DWORD Length = 0;
  
  SetupDiGetDeviceInterfaceDetail(hDevInfo,
          &DeviceInterfaceData,
          NULL,
          0,
          &Length,
          NULL);
  pDeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(Length);
  pDeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);  //MUST BE!!!

  if (!SetupDiGetDeviceInterfaceDetail(hDevInfo,
          &DeviceInterfaceData,
          pDeviceInterfaceDetailData,
          Length,
          NULL,
          NULL))
   _tprintf("查找路径设备时出错!/n");
  else
   _tprintf("设备路径:%s/n",pDeviceInterfaceDetailData->DevicePath );
  
  //打开设备句柄
  HANDLE hDeviceHandle = CreateFile(pDeviceInterfaceDetailData->DevicePath ,
            GENERIC_READ | GENERIC_WRITE,
            FILE_SHARE_READ | FILE_SHARE_WRITE,
            NULL,
            OPEN_EXISTING,
            0,
            NULL);
  if (hDeviceHandle == INVALID_HANDLE_VALUE)
   _tprintf("打开设备路径出错!/n");
  else
  {
   HIDD_ATTRIBUTES Attributes;
   HidD_GetAttributes(hDeviceHandle,&Attributes);
   //将有关该设备的标识显示出来
   _tprintf("供应商ID/t:0X%04X/n",Attributes.VendorID);
   _tprintf("产品ID/t:0X%04X/n",Attributes.ProductID);
   _tprintf("产品版本号:0X%04X/n",Attributes.VersionNumber);
   
   WCHAR mString[256];
   TCHAR Buffer[256];

   HidD_GetManufacturerString(hDeviceHandle,mString,sizeof(mString));
   if (wcstombs(Buffer,mString,256) == -1)  // fail
    Buffer[0] = NULL;
   _tprintf("生产商:/t%s/n",Buffer);
   
   HidD_GetProductString(hDeviceHandle,mString,sizeof(mString));
   if (wcstombs(Buffer,mString,256) == -1)
    Buffer[0] = NULL;
   _tprintf("产品名称:/t%s/n",Buffer);

   // 通信:
   PHIDP_PREPARSED_DATA pHidpPreparsedData;
   HIDP_CAPS    hidPCaps;
   if (!HidD_GetPreparsedData(hDeviceHandle,&pHidpPreparsedData))
   {
    _tprintf("获取 HID PREPARED DATA 失败!/n");
    return;
   }
   NTSTATUS status = HidP_GetCaps(pHidpPreparsedData,&hidPCaps);
   if (status == HIDP_STATUS_SUCCESS)
   {
    _tprintf("CAP信息如下:/n");
    _tprintf("     InputReportByteLength %d/n", hidPCaps.InputReportByteLength);
    _tprintf("     OutputReportByteLength %d/n", hidPCaps.OutputReportByteLength);
   }
   DWORD nReadBytes = 0;
   BYTE *pInputReport = new BYTE[hidPCaps.InputReportByteLength];
   memset(pInputReport,0,hidPCaps.InputReportByteLength);
   
   do
   {
    ReadFile(hDeviceHandle,pInputReport,hidPCaps.InputReportByteLength,&nReadBytes,NULL);
    if (hidPCaps.InputReportByteLength == nReadBytes)
    {
     for(unsigned int i=0; i<(nReadBytes-1);i++)
      _tprintf("%02x-",pInputReport[i]);
     _tprintf("%02x/r",pInputReport[nReadBytes-1]);
    }
    if (pInputReport[nReadBytes-2] == 0x20)  //break the loop when pressing a specific key
    {
     _tprintf("/n");
     break;
    }
    Sleep(10);
   }while(hidPCaps.InputReportByteLength == nReadBytes);

   //释放句柄资源
   CloseHandle(hDeviceHandle);
  }
    
  MemberIndex++;
 }while(bSuccess);

 SetupDiDestroyDeviceInfoList(hDevInfo);
}

游戏手柄(JoyStick)编程控制的一个简单代码(Qt)

最近买到一种USB 接口的三轴 8 个按键的Joystick。下面这个样子。 用在最近做的一个工控项目上效果还不错。这里把代码公开了。 Joystick 的控制我以前写过两篇博客: http...
  • liyuanbhu
  • liyuanbhu
  • 2017年03月25日 13:53
  • 3058

谈谈Unity对于手柄的支持

今天来谈谈关于Unity手柄的支持 一、首先我们先要搞清楚从哪开始进行控制: 二、接着来看看它里面的属性: Name:【按键名】该键的名称,可以在脚本编程中直接...
  • WandDouDou
  • WandDouDou
  • 2016年12月04日 14:55
  • 4558

获取游戏手柄的按键输入

//可以查看按游戏手柄按钮时的情况.//USB接口的游戏手柄//编译环境:Windows 2000 server+VC++ 6.0+Win2K DDK#include #include #includ...
  • mrh123
  • mrh123
  • 2004年03月03日 11:42
  • 2069

Gear VR 入门教程之二 获取用户输入

GearVR头显上按键的介绍,并且通过代码获取玩家在GearVR头显上的操作
  • u013746357
  • u013746357
  • 2016年09月02日 19:43
  • 3353

Android 小米盒子游戏手柄按键捕获 - 能获取到的 home 键依然是个痛

Android 小米盒子游戏手柄按键捕获
  • sleks
  • sleks
  • 2015年06月02日 16:43
  • 2946

linux joystick 游戏手柄编程 (获取输入数据)

啥也不说了,先上代码: 由于linux中的list.h不能直接用,所以单独提取了出来使用: //listop.h    /*it is from linux list */ #ifndef...
  • ytmayer
  • ytmayer
  • 2011年08月16日 19:32
  • 3283

D3D11 输入

本章节将介绍如何从用户直接获取输入数据,比如键盘,鼠标甚至手柄。将学习如何实现Direct输入。 主要是使用Direct输入API,或许你会疑惑为什么我们不使用Win32的API来获取用户输入,毕竟...
  • huhaoxuan2010
  • huhaoxuan2010
  • 2017年10月19日 11:40
  • 163

获取游戏手柄的按键输入

//可以查看按游戏手柄按钮时的情况.//USB接口的游戏手柄//编译环境:Windows 2000 server+VC++ 6.0+Win2K DDK#include #include #includ...
  • mrh123
  • mrh123
  • 2004年03月03日 11:42
  • 2069

Unity3D技术之键盘、操纵杆和游戏手柄输入实现详解

输入桌面 Unity 支持键盘、操纵杆和游戏手柄输入。 可以在输入管理器 (Input Manager) 中创建虚拟轴和按钮,终端用户可以在简洁美观的配置对话框中配置键盘。   您...
  • u012520952
  • u012520952
  • 2015年11月06日 12:21
  • 7292

关于游戏手柄按键的设计

一、背景 最近开发了一个空鼠遥控器的外设产品,采用Nordic51822 MCU芯片,基于BLE4.0标准,与OTT盒子连接,同时具有遥控器、空鼠、游戏手柄的功能。其中在按键的设计这块我们走了一些弯路...
  • gary531
  • gary531
  • 2014年05月04日 09:21
  • 2620
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:获取游戏手柄的按键输入
举报原因:
原因补充:

(最多只允许输入30个字)