Я пытаюсь определить тип класса устройства, подключенного к компьютеру. Если это монитор (например, для телевизора или проектора), я хочу выполнять определенные действия, такие как изменение настроек дисплея компьютера.
Мой метод определения типа класса устройства включает в себя следующие шаги:
- Зарегистрироваться для уведомлений устройства
- Обнаружить события WM_DEVICECHANGE: если значение wParam = DBT_DEVICEARRIVAL:
- Я преобразовываю значение lParam в переменную PDEV_BROADCAST_DEVICEINTERFACE и проверяю эти переменные
атрибут dbcc_classguid- Если атрибут dbcc_classguid == «{4d36e96e-e325-11ce-bfc1-08002be10318}», то я обнаружил устройство монитора
Моя проблема: Всякий раз, когда я подключаю свой широкоэкранный телевизор LG к компьютеру, он отправляет нераспознаваемый dbcc_classguid.
Почему-то при подключении телевизора я получаю 2 сообщения DBT_DEVICEARRIVAL. LParam содержит следующие GUID. Какого рода класс устройства это?:
{E6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
{866519b5-3f07-4c97-b7df-24c5d8a8ccb8}
Как ни странно, если я проверяю приложение диспетчера устройств Windows (после подключения телевизора), я вижу, что телевизор хранится в разделе «Мониторы» и что GUID его класса действительно является GUID класса монитора, т. Е. {4d36e96e-e325-11ce-bfc1 -08002be10318}. Так что это действительно странно. Также я подключил к своему ноутбуку обычный экран монитора компьютера, и он отправил те же идентификаторы GUID, а также отправил 2 сообщения о прибытии.
Вот мой код. Почему я получаю странные идентификаторы класса GUID при подключении телевизора к компьютеру? Для какого устройства эти 2 GUID? Может быть, я получаю Аппаратные GUID а не Класс GUID?
case DBT_DEVICEARRIVAL:
{
PDEV_BROADCAST_HDR pBroad = (PDEV_BROADCAST_HDR) lParam;
if (pBroad->dbch_devicetype != DBT_DEVTYP_DEVICEINTERFACE) {
debug_print("pBroad->dbch_devicetype != DBT_DEVTYP_DEVICEINTERFACE\n");
break;
}
PDEV_BROADCAST_DEVICEINTERFACE pInter = (PDEV_BROADCAST_DEVICEINTERFACE) pBroad;
_tprintf(_T("Device Data: %s\n %x\n\n"), pInter->dbcc_name, pInter->dbcc_devicetype);
debug_print("Printing Device Data");
outputDeviceData(toString(pInter->dbcc_classguid), SPDRP_CLASSGUID);
if (isMonitorDevice(pInter->dbcc_classguid)) {
// TODO: change display mode and etc.
debug_print("is MonitorDevice!!!");
}
else debug_print("is NOT MonitorDevice!!!");
}
break;
Вывод моего приложения:
Сообщение DBT_DEVICEARRIVAL:
Данные устройства:
\? \ DISPLAY # GSM3AD7 # 5&20a3f50d&0&UID513 # {866519b5-3f07-4c97-b7df-24
c5d8a8ccb8} 5{866519b5-3f07-4c97-b7df-24c5d8a8ccb8} не является MonitorDevice !!!
Сообщение DBT_DEVICEARRIVAL:
Данные устройства:
\? \ DISPLAY # GSM3AD7 # 5&20a3f50d&0&UID513 # {e6f07b5f-ee97-4a90-b076-33
f57bf4eaa7} 5{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7} НЕ является MonitorDevice !!!
{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
является GUID_DEVINTERFACE_MONITOR
Страница MSDN это здесь. Что-то должно быть не так с вашим isMonitorDevice()
функция, я не могу видеть это отсюда. Используйте IsEqualGUID () для сравнения значений guid.
Других решений пока нет …