分享
 
 
 

获取游戏手柄的按键输入

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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

//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);

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有