国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++ 獲取多顯示器設(shè)備信息

這篇具有很好參考價值的文章主要介紹了C++ 獲取多顯示器設(shè)備信息。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

思路:

  1. 通過EnumDisplayMonitors枚舉所有的顯示器
  2. 通過GetMonitorInfo獲取設(shè)備分辨率
  3. 通過EnumDisplaySettings獲取設(shè)備刷新頻率
  4. 通過EnumDisplayDevices獲取edid數(shù)據(jù)在注冊表中的位置
  5. 解析edid獲取設(shè)備尺寸,廠商,名稱等信息
  6. 通過CreateDC獲取指定屏幕的HDC

edit參考:EDID標準簡介,EDID的簡介和解析

下面是實現(xiàn)代碼:

typedef struct stMonitorInfo
{
	TCHAR szfirm[4];//廠商
	TCHAR szname[18];//顯示器名稱
	unsigned long resolution_width, resolution_heght;//分辨率
	unsigned long device_width_cm, device_heght_cm;//設(shè)備尺寸
	unsigned long frequency;//設(shè)備刷新頻率
	stMonitorInfo()
	{
		memset(this, 0, sizeof(stMonitorInfo));
	}
}stMonitorInfo;

枚舉設(shè)備并且獲取設(shè)備信息文章來源地址http://www.zghlxwxcb.cn/news/detail-517204.html

	BOOL CALLBACK _MonitorEnumProc(HMONITOR hMonitor,  // handle to display monitor
		HDC hdcMonitor,     // handle to monitor DC
		LPRECT lprcMonitor, // monitor intersection rectangle
		LPARAM dwData       // data
		)
	{
		std::vector<stMonitorInfo> *pvec_monitor = (std::vector<stMonitorInfo>*) dwData;

		
		MONITORINFOEX miex;
		miex.cbSize = sizeof(miex);
		if (GetMonitorInfo(hMonitor, &miex))
		{
			stMonitorInfo monitor_info;
			monitor_info.resolution_width = miex.rcMonitor.right - miex.rcMonitor.left;
			monitor_info.resolution_heght = miex.rcMonitor.bottom - miex.rcMonitor.top;

			//monitor_info.device_millimeters_width = GetDeviceCaps(hdcMonitor, HORZSIZE);
			//monitor_info.device_millimeters_heght = GetDeviceCaps(hdcMonitor, VERTSIZE);

			

			DEVMODE devMode = { 0 };
			devMode.dmSize = sizeof(devMode);
			devMode.dmDriverExtra = sizeof(0);
			if (EnumDisplaySettings(miex.szDevice, ENUM_CURRENT_SETTINGS, &devMode))
			{
				if (devMode.dmFields & DM_DISPLAYFREQUENCY)
				{
					monitor_info.frequency = devMode.dmDisplayFrequency;
				}
			}

			//為了防止edid不對,采取HDC方式獲取
			HDC hdc = CreateDC(NULL, miex.szDevice, NULL, NULL);
			if (hdc)
			{
				get_display_physical_size(hdc, monitor_info.device_width_cm, monitor_info.device_heght_cm);
				DeleteDC(hdc);
			}
				

			DISPLAY_DEVICE data = { 0 };
			data.cb = sizeof(data);
			if (EnumDisplayDevices(miex.szDevice, 0, &data, EDD_GET_DEVICE_INTERFACE_NAME))
			{
				//DeviceID "\\\\?\\DISPLAY#DELA07A#5&30f41049&0&UID4352#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}"	char[128]
				//開始解析
				printf("Monitor DeviceID:%s\r\n", data.DeviceID);
				std::vector<std::string> vec_data;
				split(data.DeviceID, "#", vec_data);
				if (vec_data.size() >= 3)
				{
					char szKey[1024] = "";
					_stprintf_s(szKey, 1024, "SYSTEM\\CurrentControlSet\\Enum\\DISPLAY\\%s\\%s\\Device Parameters", vec_data[1].c_str(), vec_data[2].c_str());
					
					std::vector<BYTE> edid;
					if (Registry::Read(HKEY_LOCAL_MACHINE, szKey, "EDID", edid))
					{
						//這里應(yīng)該計算校驗和如果校驗和不對則忽略
						if (monitor_info.device_width_cm == 0 && monitor_info.device_heght_cm == 0)
						{
							monitor_info.device_width_cm = edid[0x15];
							monitor_info.device_heght_cm = edid[0x16];
						}
						
						//給一個默認名稱,方式edid數(shù)據(jù)里面沒有名稱
						lstrcpyn(monitor_info.szname, vec_data[1].c_str(), 260);
						//避免大小端問題
						std::bitset<8> bits0(edid[8]);
						std::bitset<8> bits1(edid[9]);
						std::string strBits = bits0.to_string() + bits1.to_string();
						std::bitset<5> prd0(strBits, 1);
						std::bitset<5> prd1(strBits, 6);
						std::bitset<5> prd2(strBits, 11);
						ULONG lval0 = prd0.to_ulong();
						ULONG lval1 = prd1.to_ulong();
						ULONG lval2 = prd2.to_ulong();

						monitor_info.szfirm[0] = TCHAR('A') + lval0 - 1;
						monitor_info.szfirm[1] = TCHAR('A') + lval1 - 1;
						monitor_info.szfirm[2] = TCHAR('A') + lval2 - 1;
						
						//獲取顯示器名稱
						std::vector<int> vec = { 0x36, 0x48, 0x5a, 0x6c };
						for (int i = 0; i < vec.size(); ++i)
						{
							
							int nindex = vec[i];
							if (edid[nindex] == 0x00 && edid[nindex + 1] == 0x00 && edid[nindex + 2] == 0x00 && edid[nindex +3] == 0xfc)
							{
								std::string str((char *)&edid[nindex + 4], 14);
								//刪除\0 \n 0x20
								if (str[0] == 0) str = str.substr(1);
								while (!str.empty())
								{
									if (str[str.size() - 1] == 0x20 || str[str.size() - 1] == '\n')
									{
										str = str.substr(0, str.size() - 1);
										continue;
									}
									break;										
								}
								lstrcpy(monitor_info.szname, str.c_str());
							}
						}
					}
				}
				
			}
			pvec_monitor->push_back(monitor_info);
		}
		return TRUE;
	}

	void get_monitor_info(std::vector<stMonitorInfo> &vec_monitor)
	{
		EnumDisplayMonitors(NULL, NULL, _MonitorEnumProc, (LPARAM)&vec_monitor);
	}
	void get_display_resolution(int &width, int &height)
	{
		static int Width{ GetSystemMetrics(SM_CXSCREEN) };
		static int Heigth{ GetSystemMetrics(SM_CYSCREEN) };
		width = Width;
		height = Heigth;
	}

	void get_display_physical_size(HDC hdc,unsigned int &width_millimeters, unsigned int &height_millimeters)
	{
		bool bRelease = false;
		if (hdc == NULL)
		{
			bRelease = true;
			hdc = GetDC(NULL);
		}
		
		width_millimeters = GetDeviceCaps(hdc, HORZSIZE)/10;
		height_millimeters = GetDeviceCaps(hdc, VERTSIZE)/10;
		if (bRelease)
			ReleaseDC(NULL, hdc);
	}

到了這里,關(guān)于C++ 獲取多顯示器設(shè)備信息的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Qt怎么獲取顯示器分辨率

    您可以使用QScreen類來獲取當前顯示器的分辨率。以下是一個示例代碼: 上面的程序?qū)⑤敵鲋髌聊坏姆直媛省?如果您有多個顯示器并且需要獲取其中一個的分辨率,則可以使用QDesktopWidget類。下面是一個示例代碼: 上面的程序?qū)⑤敵龅?個屏幕的分辨率。請注意,屏幕編號從

    2024年02月13日
    瀏覽(33)
  • 遠程ubuntu 20.04的nvidia驅(qū)動自動更新,機器重啟后,ToDesk或者向日葵等遠程連接黑屏,解決辦法:為遠程設(shè)備添加虛擬顯示器

    遠程ubuntu 20.04的nvidia驅(qū)動自動更新,機器重啟后,ToDesk或者向日葵等遠程連接黑屏,解決辦法:為遠程設(shè)備添加虛擬顯示器

    第4部分的解決辦法,很多網(wǎng)友反映,會導(dǎo)致 物理顯示器不能用 !請仔細閱讀文章里的解決辦法。 請仔細 閱讀第5部分的特別注意事項, 虛擬顯示器會和物理顯示器沖突。讓虛擬顯示器和物理顯示器同時工作的解決辦法,請參考第5部分, 合并虛擬顯示器和物理顯示器的 xo

    2024年01月16日
    瀏覽(26)
  • 中柏 EZpad 8 Windows 平板電腦 |驅(qū)動備份|系統(tǒng)優(yōu)化|不能調(diào)節(jié)顯示器亮度|進入Bios/uefi 快捷鍵 |藍牙掃描不到設(shè)備|CPU占用過高解決方案

    中柏 EZpad 8 Windows 平板電腦 |驅(qū)動備份|系統(tǒng)優(yōu)化|不能調(diào)節(jié)顯示器亮度|進入Bios/uefi 快捷鍵 |藍牙掃描不到設(shè)備|CPU占用過高解決方案

    ? ? ? ? ? 之前一直使用的這個平板,但是有個很嚴重的問題就是性能實在太差了,每次都是CPU百分百,Mem 百分之50% 這個結(jié)果真的很意外, 但是又無可奈何,后面花時間做了一些優(yōu)化包括 進程限制? 啟動優(yōu)化? 內(nèi)存頁面優(yōu)化? 但結(jié)果都不盡人意,一啟動程序就卡頓 ..........? 中間又

    2024年02月09日
    瀏覽(26)
  • 【Flutter】Flutter 使用 device_info_plus 獲取設(shè)備的制造商、型號等信息

    【Flutter】Flutter 使用 device_info_plus 獲取設(shè)備的制造商、型號等信息 在這篇博客中,我將為你介紹一個非常實用的 Flutter 插件: device_info_plus 。這個插件可以幫助我們獲取設(shè)備的詳細信息,如制造商、型號等,以及應(yīng)用程序正在運行的 Android 或 iOS 版本。 本文的重點如下: 如

    2024年02月05日
    瀏覽(21)
  • ManjaroLinux擴展顯示器,連接顯示器。

    ManjaroLinux擴展顯示器,連接顯示器。

    如何設(shè)置多顯示器的顯示 在這里可以使用xrandr來進行設(shè)置。 1.插入顯示器的接口 這時,我們把剛買的顯示器的接口接到顯示器上面,確保顯示器和筆記本直接的連接沒有問題。 2.查看顯示器是否連接成功 我們輸入命令 回車后可以看到如下擴展顯示器的設(shè)備接口名稱以及可顯

    2024年02月11日
    瀏覽(32)
  • 顯示器原理(1):CRT顯示器

    大家好,這個系列將會從歷史、參數(shù)角度來詳細講解顯示器及跟顯示器有關(guān)的技術(shù)。 首先,我們先列出一個目錄,方便大家理解顯示器的參數(shù)在哪里起效,這里列出的都是常見的,不常見的我們也會講,這里就不列出了 這張表格在后幾期會用到,我會詳細講解色域、刷新率

    2024年02月09日
    瀏覽(33)
  • 解決 Ubuntu 外接顯示器后,顯示器不亮

    解決 Ubuntu 外接顯示器后,顯示器不亮

    目錄 原因 解決辦法 step1: 修改軟件源 step2:查看可安裝的驅(qū)動版本 step3:安裝推薦版本的驅(qū)動(recommended) step4:查看是否安裝成功 step5:重啟電腦,發(fā)現(xiàn)外接顯示器已亮。 沒有裝顯卡驅(qū)動。 step1: 修改軟件源 打開 應(yīng)用程序 —— 軟件和更新,在 Ubuntu 軟件 界面,點下載自的

    2024年02月09日
    瀏覽(103)
  • ubuntu外接顯示器、不識別筆記本顯示器

    如題:ubuntu外接顯示器、不識別筆記本顯示器 雙屏幕,筆記本外接顯示器HDMI,然后安裝Nvidia顯卡驅(qū)動,之后重啟筆記本顯示器無法識別,只能使用外接顯示器了。 中文網(wǎng)站找遍了都沒有解決方案,然后用英文搜索,得到這篇文章解決了問題: Internal laptop screen not detected wh

    2024年02月05日
    瀏覽(99)
  • 2023年2K顯示器推薦 | 有什么好用的2K顯示器?

    2023年2K顯示器推薦 | 有什么好用的2K顯示器?

    開玩笑,如果是同價位來說,當然還是選Nano IPS了,畫質(zhì)好延遲低,妥妥的電競顯示器首選。關(guān)鍵你還是主玩LOL平時看電影,對延遲的要求遠低于畫質(zhì)吧,所以TN屏就不用考慮了。Nano IPS的色彩表現(xiàn)的確是IPS屏中的佼佼者,畢竟是色域都可以達到95%以上的DCI-P3,可以產(chǎn)生更加鮮

    2024年02月11日
    瀏覽(20)
  • Mac 連接顯示器,外接顯示器不出影像

    Mac 連接顯示器,外接顯示器不出影像

    1. 現(xiàn)象 轉(zhuǎn)換頭,連接線已正確連接; 顯示器電源等也亮,且是已有視頻信號的狀態(tài); 查看設(shè)置–顯示器,里面也顯示識別出已連接外接顯示器 2. 解決辦法 顯示器支持的 最高刷新率 與 系統(tǒng)設(shè)置的刷新率 不一致的 2.1 打開 設(shè)置 – 顯示器 2.2 點擊底部 顯示器設(shè)置 2.3 重點在這

    2024年02月11日
    瀏覽(112)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包