Сбой HidD_GetAttributes для мыши Logitech B100

У меня есть два HID-совместимых устройства от Logitech (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_046dpid_c05a # 7be ... VID: -1 PID -1

\\? \ hid # vid_046dpid_c31cmi_0 ... VID: 1133 PID 49948

\\? \ hid # vid_046dpid_c31cmi_0 ... VID: 1133 PID 49948

\\? \ hid # vid_046dpid_c31cmi_0 ... VID: 1133 PID 49948

\\? \ hid # vid_046dpid_c31cmi_0 ... VID: -1 PID -1

Почему я не могу получить доступ к мыши?

1

Решение

Я боролся с этим в течение нескольких дней. Я считаю, что это связано с Окна открывают мышки и клавиатуры в эксклюзивном режиме.

Я обнаружил, что некоторые из моих клавиатур появился работать, но только потому, что они выставляли HID конечные точки, которые не были мышью / клавиатурой, в дополнение к «реальным» дескрипторам.

Вы можете подтвердить это, также захватывая SPDRP_DEVICEDESC использование имущества SetupDiGetDeviceRegistryProperty. Для моей системы все красные «сельди» были HID-совместимыми устройствами или системными контроллерами, а сбои были HID-совместимой мышью или клавиатурой.

Попробуйте открыть файл в режиме 0 (вместо обычного чтения / записи). Функции тогда работали для меня.

-1

Другие решения


По вопросам рекламы [email protected]