VC学习:获取游戏手柄的按键输入

2016-02-19 14:28 264 1 收藏

图老师设计创意栏目是一个分享最好最实用的教程的社区,我们拥有最用心的各种教程,今天就给大家分享VC学习:获取游戏手柄的按键输入的教程,热爱PS的朋友们快点看过来吧!

【 tulaoshi.com - 编程语言 】

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

  //USB接口的游戏手柄

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

  #include
  #include
  #include
  #include
  extern "C"
  {
  #include
  }

  void main()
  {
  GUID HidGuid;

  // 查找本系统中HID类的GUID标识
  HidD_GetHidGuid(&HidGuid);
  _tprintf("系统中HID类的GUID标识为:%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
  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设备发生错误");

  return;
  }

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

  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设备!");
  else
  _tprintf("没有更多的可用的USB设备!");

  SetupDiDestroyDeviceInfoList(hDevInfo);
  return;
  }

  _tprintf("找到了一个USB设备:");
  //若找到了一个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("查找路径设备时出错!");
  else
  _tprintf("设备路径:%s",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("打开设备路径出错!");
  else

  {
  HIDD_ATTRIBUTES Attributes;
  HidD_GetAttributes(hDeviceHandle,&Attributes);
  //将有关该设备的标识显示出来
  _tprintf("供应商ID:0X%04X",Attributes.VendorID);
  _tprintf("产品ID:0X%04X",Attributes.ProductID);
  _tprintf("产品版本号:0X%04X",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("生产商:%s",Buffer);

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

  // 通信:
  PHIDP_PREPARSED_DATA pHidpPreparsedData;
  HIDP_CAPS hidPCaps;
  if (!HidD_GetPreparsedData(hDeviceHandle,&pHidpPreparsedData))
  {
  _tprintf("获取 HID PREPARED DATA 失败!");
  return;
}
  NTSTATUS status = HidP_GetCaps(pHidpPreparsedData,&hidPCaps);
  if (status == HIDP_STATUS_SUCCESS)
  {
  _tprintf("CAP信息如下:");
  _tprintf(" InputReportByteLength %d", hidPCaps.InputReportByteLength);
  _tprintf(" OutputReportByteLength %d", hidPCaps.OutputReportByteLength);
  }
  DWORD nReadBytes = 0;
  BYTE *pInputReport = new BYTE[hidPCaps.InputReportByteLength];
  memset(pInputReport,0,hidPCaps.InputReportByteLength);

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  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",pInputReport[nReadBytes-1]);
  }
  if (pInputReport[nReadBytes-2] == 0x20) //break the loop when pressing a specific key
  {
  _tprintf("");
  break;
  }
  Sleep(10);
  }while(hidPCaps.InputReportByteLength == nReadBytes);

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  //释放句柄资源
  CloseHandle(hDeviceHandle);
  }

  MemberIndex++;
  }while(bSuccess);

  SetupDiDestroyDeviceInfoList(hDevInfo);
  }

来源:http://www.tulaoshi.com/n/20160219/1607030.html

延伸阅读
在VC中通过HTTP方式获取网页,我试过好几种方式,但是都有问题,现将我用的两种虽然也有问题但基本可以实现的方式写出来,如果大家有更好的方式或者能解决我所遇到的问题,请告诉我:QQ158792331,邮箱:werther161@yahoo.com.cn 第一种: 首先要包含这个头文件:#include afxinet.h   CInternetSession mySession;   CHttpFile* myHttpFile...
  近日写程序,让全局共享变量给害苦了,现将结果公布出来,不希望有人步我后尘。   先总结经验:全局共享变量一定要在定义时初始化,否则无效。   下面写两行代码进行验证(Visual Studio .NET 2003 + Windows Servers 2003):   ////////////////////////////   //main.c   #include   #include "r...
《秋叶原之旅2》键盘与手柄按键操作攻略 《秋叶原之旅2》PC版刚刚与大家见面,游戏中该怎么操作呢?今天图老师图老师小编为大家带来《秋叶原之旅2》PC版键盘与手柄按键操作一览。 大家可以在按键操作界面中发现一些可能被忽略的选项,比如说拍照、潜行功能等,一起来看吧。 《秋叶原之旅2》白金玩家个人心得 《秋叶原之旅2》前...
标签: 游戏动漫
《火焰限界》按键操作方法 手柄操作一览 即将上市,对于该游戏的操作有多复杂呢,怎么操作,下面就为玩家带来按键操作方法 手柄操作一览。   XBOX360手柄按键操作: back键:游戏菜单。 start键:停止。 LT键:快速进入技能、物品选单。 RT键:格挡(剑士/游侠)。 LB键:战术菜单。 RB键:切换战斗姿势。 左摇杆:控制行走/(...
搜狗输入法如何取消按键震动   1)安装搜狗输入法,打开系统设置依次点击   2)点击→选择弱,即可以消除振动提示。           注 :更多精彩教程请关注图老师手机教程栏目,图老师手机数码群:296605639欢迎你的加入

经验教程

992

收藏

33
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部