4

セカンダリ モニターのデバイス名を取得する必要があります。ただし、単純にデバイス名を取得しようとすると、出力はDISPLAY1, DISPLAYV1and などになります。

ただし、ここで言及されている表示名のように、画面の解像度を確認するときに表示される名前が必要です。

まず、この文字列をどこから入手できるかわかりません。friendlyname少し読んでみると、それはデバイスのものだと思います。ただし、EnumDisplaySetting()Unhandled Exception: Could not access memory locationを呼び出すと、この関数が呼び出されたときに私に与えられているので、わかりません。そのため、フレンドリ名が正確に何であるかを確認できませんでした。そして、未処理の例外は、DISPLAY_DEVICE 内の driverextra の DISPLAY_DEVICE へのメモリの不適切な割り当てが原因であると考えています。これは次の理由によるものだと思います。

iModeNum がディスプレイ デバイスの最後のグラフィック モードのインデックスより大きい場合、関数は失敗します。

ここで述べた


また、同じリンクで言及されているように、DISPLAY_DEVICE-> dmDriverExtraに割り当てる必要があるメモリの量もわかりませんでした。

EnumDisplaySettings を呼び出す前に、dmSize メンバーを sizeof(DEVMODE) に設定し、dmDriverExtra メンバーを設定して、プライベート ドライバー データの受信に使用できる追加領域のサイズ (バイト単位) を示します。

だから私の質問は多様です:

1) dmDriverExtra にどのくらいのメモリを割り当てる必要がありますか?

2) Friendlyname は、画面解像度の [表示] タブで提供される名前にアクセスするために必要な正しいパラメーターです。または、他のパラメーターが必要でない場合はどうすればよいですか?

3) この未処理の例外は、メモリ割り当てが不適切なために発生したものですか、それとも他の理由がありますか?

4) セカンダリ モニターのフレンドリーネームにアクセスする他の方法はありますか?

4

1 に答える 1

4

更新しました

GetMonitorInfo の代わりに PhysicalMonitorAPI を使用するように切り替えました。私はオリジナルのソリューションを最初のものと組み合わせました。これにより、期待するより妥当な出力が生成されます (たとえば、「\.\Display1」ではなく「Dell UH2313」)。

技術的には、ハードコードされた配列を使用する代わりに、モニターの配列を割り当てる必要がありますが、dwCount が 1 より大きい値に初期化される場所は見たことがありません。

このプログラムは Visual Studio で正常にコンパイルされますが、 PhysicalMonitor APIの定義を取得するには dxva2.lib とリンクする必要があります。

#include <Windows.h>
#include <PhysicalMonitorEnumerationAPI.h>
#include <string>
#include <iostream>
#include <stdio.h>

BOOL __stdcall MyMonitorEnumProc
(
_In_ HMONITOR hMonitor,
_In_ HDC      hdcMonitor,
_In_ LPRECT   lprcMonitor,
_In_ LPARAM   dwData
)
{
    DWORD dwCount = 0;
    std::wstring strName(L"Unknown monitor name");
    PHYSICAL_MONITOR monitors[100] = {};
    MONITORINFOEX info = {};
    info.cbSize = sizeof(info);

    if (GetMonitorInfo(hMonitor, (LPMONITORINFO)&info))
    {
        strName = info.szDevice;
    }

    if (GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor, &dwCount) && (dwCount > 0) && (dwCount < ARRAYSIZE(monitors)))
    {
        if (GetPhysicalMonitorsFromHMONITOR(hMonitor, dwCount, monitors))
        {
            strName = monitors[0].szPhysicalMonitorDescription;

            DestroyPhysicalMonitors(dwCount, monitors);
        }
    }

    std::wcout << L"Monitor: " << strName << std::endl;

    return TRUE;
}

void printMonitorNames()
{
    EnumDisplayMonitors(NULL, NULL, MyMonitorEnumProc, NULL);
}

int _tmain(int argc, _TCHAR* argv[])
{
    printMonitorNames();
    return 0;
}

そして、MyMonitorEnumProc がプライマリ モニターに対して最初に呼び出されるのは良い賭けです。他のすべてのモニターが次に列挙されます。

于 2015-10-01T16:09:36.983 に答える