- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有两个罗技的 HID 兼容设备 (VendorID 0x046d == 1133):K120 键盘 (ProductID 0xC31C == 49948) 和 B100 鼠标 (ProductID 0xc05a == 49242)
我可以使用 HID 类支持例程成功地与键盘对话 https://msdn.microsoft.com/en-us/library/windows/hardware/ff538865(v=vs.85).aspx
虽然控制面板显示鼠标已正确安装,并且它确实可以用作鼠标,但每个 HID 类例程都返回失败。
此代码显示 HidD_GetAttributes 在键盘上工作,但在鼠标上不工作
#include <iostream>
#include <windows.h>
#include <setupapi.h>
#include <ddk/hidsdi.h>
using namespace std;
int main()
{
// get info set for all present HIDs
GUID HID_GUID;
HidD_GetHidGuid( & HID_GUID );
HDEVINFO DeviceInfoSet = SetupDiGetClassDevs(
&HID_GUID,
NULL,NULL,
DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
SP_DEVICE_INTERFACE_DATA DeviceInfoData;
DeviceInfoData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
int DeviceIndex = 0;
// loop over present HIDs
while ( SetupDiEnumDeviceInterfaces(
DeviceInfoSet,
NULL,
&HID_GUID,
DeviceIndex,
&DeviceInfoData))
{
DeviceIndex++;
//Get the details with null values to get the required size of the buffer
PSP_INTERFACE_DEVICE_DETAIL_DATA deviceDetail;
ULONG requiredSize = 0;
SetupDiGetDeviceInterfaceDetail (DeviceInfoSet,
&DeviceInfoData,
NULL, //interfaceDetail,
0, //interfaceDetailSize,
&requiredSize,
0); //infoData))
//Allocate the buffer
deviceDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(requiredSize);
deviceDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
//Fill the buffer with the device details
if (!SetupDiGetDeviceInterfaceDetail (DeviceInfoSet,
&DeviceInfoData,
deviceDetail,
requiredSize,
&requiredSize,
NULL))
{
cout << "SetupDiGetDeviceInterfaceDetail failed";
continue;
}
// open the HID handle
string myPath = deviceDetail->DevicePath;
HANDLE myHandle = CreateFile(myPath.c_str(),
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if( ! myHandle )
{
cout << "Create File failed";
continue;
}
// get attributes of HID
int myVendorID;
int myProductID;
_HIDD_ATTRIBUTES attributes;
attributes.Size = sizeof( _HIDD_ATTRIBUTES );
if( HidD_GetAttributes(
myHandle,
&attributes ) )
{
myVendorID = attributes.VendorID;
myProductID = attributes.ProductID;
}
else
{
// failure
myVendorID = -1;
myProductID = -1;
}
// display logitech devices
if( myPath.find("vid_046d") != -1 )
cout << myPath.substr(0,30) << "... VID: " << myVendorID
<< " PID " << myProductID << endl << endl;
}
return 0;
}
输出是:
\\?\hid#vid_046d&pid_c05a#7&be... VID: -1 PID -1\\?\hid#vid_046d&pid_c31c&mi_0... VID: 1133 PID 49948\\?\hid#vid_046d&pid_c31c&mi_0... VID: 1133 PID 49948\\?\hid#vid_046d&pid_c31c&mi_0... VID: 1133 PID 49948\\?\hid#vid_046d&pid_c31c&mi_0... VID: -1 PID -1
为什么我不能访问鼠标?
最佳答案
这几天我一直在为这个问题苦苦挣扎。我相信这与 Windows opening mice and keyboards in exclusive mode 有关.
我发现我的几个键盘似乎可以工作,但只是因为除了“真实”描述符之外,它们还公开了不是鼠标/键盘的 HID 端点。
您还可以通过使用 SetupDiGetDeviceRegistryProperty
获取 SPDRP_DEVICEDESC
属性来确认这一点.对于我的系统,所有的红鲱鱼都是符合 HID 标准的设备或系统 Controller ,而故障都是符合 HID 标准的鼠标或键盘。
尝试以模式 0(而不是通用读/写)打开文件。然后这些功能对我有用。
关于c++ - Logitech B100 鼠标的 HidD_GetAttributes 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32338650/
我是一名优秀的程序员,十分优秀!