DBT_DEVICEARRIVAL Сообщение отправляет нераспознаваемые GUID класса

Я пытаюсь определить тип класса устройства, подключенного к компьютеру. Если это монитор (например, для телевизора или проектора), я хочу выполнять определенные действия, такие как изменение настроек дисплея компьютера.

Мой метод определения типа класса устройства включает в себя следующие шаги:

  • Зарегистрироваться для уведомлений устройства
  • Обнаружить события 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 !!!

1

Решение

{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7} является GUID_DEVINTERFACE_MONITOR

Страница MSDN это здесь. Что-то должно быть не так с вашим isMonitorDevice() функция, я не могу видеть это отсюда. Используйте IsEqualGUID () для сравнения значений guid.

1

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

Других решений пока нет …

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