1

コンピュータに接続されているデバイスのクラス タイプを特定しようとしています。モニター(テレビやプロジェクターなど)の場合、コンピューターのディスプレイ設定の変更などの特定のアクションを実行したいと思います。

デバイスのクラス タイプを決定する私の方法には、次の手順が含まれます。

  • デバイス通知に登録する
  • WM_DEVICECHANGE イベントを検出します: wParam 値 = DBT_DEVICEARRIVAL の場合:
    • lParam 値を PDEV_BROADCAST_DEVICEINTERFACE 変数に変換し、その変数の dbcc_classguid 属性を調べます
    • dbcc_classguid 属性 == "{4d36e96e-e325-11ce-bfc1-08002be10318}" の場合、監視デバイスが見つかりました

私の問題: LG ワイド スクリーン TV をコンピュータに接続するたびに、認識できない 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 つの到着メッセージも送信されました。

これが私のコードです。TV をコンピュータに接続すると、奇妙なクラス 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_DEVICEEARRIVAL:

デバイス データ: \?\DISPLAY#GSM3AD7#5&20a3f50d&0&UID513#{866519b5-3f07-4c97-b7df-24 c5d8a8ccb8} 5

{866519b5-3f07-4c97-b7df-24c5d8a8ccb8} は MonitorDevice ではありません!!!

メッセージ DBT_DEVICEEARRIVAL:

デバイス データ: \?\DISPLAY#GSM3AD7#5&20a3f50d&0&UID513#{e6f07b5f-ee97-4a90-b076-33 f57bf4eaa7} 5

{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7} は MonitorDevice ではありません!!!

4

1 に答える 1

1

{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}GUID_DEVINTERFACE_MONITOR

MSDNページはこちら. あなたの機能に何か問題があるに違いありませんisMonitorDevice()。ここからはわかりません。Guid 値を比較するには、IsEqualGUID() を使用します。

于 2013-01-27T10:47:28.363 に答える