Parade Series - MutiDisplay

在这里插入图片描述

class XQueue(XObject):
    _FIX_SIZE_ = 8
    _queue_ = None
    _active_ = False
    _context_ = None

    def __init__(self):
        super().__init__()
        self._queue_ = queue.Queue()

    def json(self):
        alpha = {
            "Active": self.getStatus(),
            "Context": self.getContext(),
            "Size": self.size(),
        }
        return alpha

    def getContext(self):
        return self._context_
    def setContext(self, context):
        self._context_ = context

    def isActive(self):
        return self._active_
    def getStatus(self):
        return self._active_
    def setStatus(self, status):
        self._active_ = status

    def queue(self):
        return self._queue_
    def size(self):
        return self.queue().qsize()
    def clear(self):
        self._queue_.empty()
    def push(self, item):
        if (self.size() > (self._FIX_SIZE_ - 1)):
            self._queue_.get()
        return self._queue_.put(item)
    def pop(self):
        return self._queue_.get()
    def list(self):
        return list(self._queue_.queue)

在这里插入图片描述
DISPLAY_DEVICE

+		DeviceName	0x00000037568febd4 "\\\\.\\DISPLAY1\\Monitor0"
+		DeviceString	0x00000037568febf4 "Surface Panel"
+		DeviceID	0x00000037568fec78 "\\\\?\\DISPLAY#LGD06B1#4&8bc03bf&0&UID8388688#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}"	char[128]
+		DeviceKey	0x00000037568fecf8 "\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Class\\{4d36e96e-e325-11ce-bfc1-08002be10318}\\0000"

EDID HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY

C:\Conda\atmosphere>reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\LGD06B1\4&8bc03bf&0&UID8388688\Device Parameters" /v EDID

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\LGD06B1\4&8bc03bf&0&UID8388688\Device Parameters
    EDID    REG_BINARY    00FFFFFFFFFFFF0030E4B106A1272100001F0104A51B127803EF70A7514CA8260E4F5300000001010101010101010101010101010101DE8A4078B08037703020550012B71000001A000000FD001E78F0F048010A202020202020000000FE004C47445F4D50312E315F0A2020000000FE004C503132395754323132313636017D70132E00000301147F1501883F0B4F0007801F007F071F08410007000301147F1501083F0B4F0007801F007F074F00410007004500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090
	INT iNumber = GetSystemMetrics(SM_CMONITORS);
	std::cout << "\n" << "Monitor Numbers: " << iNumber << "\n" << std::endl;

	HDC hdc = ::GetDC(NULL);
	std::vector<MonitorItem> monitorList;
	EnumDisplayMonitors(hdc, NULL, EnumMonitorProc, (LPARAM)&monitorList);
typedef struct tagEnumMonitor {
	CHAR devName[32];
	CHAR vendorName[32];
	CHAR firmName[32];
	INT isPrimary;
	INT capsWidth;
	INT capsHeight;
	INT metricsWidth;
	INT metricsHeight;
} MonitorItem;

void splitString(const std::string& inputString, char ch, std::vector<std::string>& vectorString)
{
	std::istringstream iss(inputString);
	std::string item;
	while (getline(iss, item, ch)) vectorString.push_back(item);
	return;
}

std::string hexArrayString(const char* data, size_t size) {
	std::stringstream ss;
	ss << std::hex << std::setfill('0');
	for (size_t i = 0; i < size; ++i) {
		ss << std::setw(2) << static_cast<int>(static_cast<unsigned char>(data[i]));
	}
	return ss.str();
}

std::vector<BYTE> bytes2Vector(const char* charArray) {
	size_t length = std::char_traits<char>::length(charArray);
	std::vector<BYTE> byteVector(length);
	std::copy(charArray, charArray + length, byteVector.begin());
	return byteVector;
}

INT index = 0;
BOOL CALLBACK EnumMonitorProc(HMONITOR handle, HDC hdc, LPRECT rect, LPARAM param) {
	LONG result;
	std::vector<MonitorItem>* list = (std::vector<MonitorItem>*)param;
	MONITORINFOEXA mi;
	ZeroMemory(&mi, sizeof(mi));
	mi.cbSize = sizeof(mi);
	GetMonitorInfoA(handle, &mi);

	MonitorItem item = { 0 };
	INT nWidth = 0, nHeight = 0;
	strcpy_s(item.devName, (const char*)mi.szDevice);

	DEVMODE devMode = { 0 };
	ZeroMemory(&devMode, sizeof(devMode));
	devMode.dmSize = sizeof(devMode);
	EnumDisplaySettings((item.devName), ENUM_CURRENT_SETTINGS, &devMode);

	DISPLAY_DEVICE displayDevice = { 0 };
	displayDevice.cb = sizeof(displayDevice);
	if (EnumDisplayDevices(mi.szDevice, 0, &displayDevice, EDD_GET_DEVICE_INTERFACE_NAME)) {
		strcpy_s(item.vendorName, (const char*)displayDevice.DeviceString);

		std::vector<std::string> vectorDeviceID;
		splitString(std::string(displayDevice.DeviceID), '#', vectorDeviceID);

		HKEY hkey = 0;
		DWORD dwType = 0, sl = 256;
		CHAR szSubKey[1024] = { 0 }, szData[256] = { 0 };

		memset(szSubKey, 0x00, sizeof(szSubKey));
		memset(szData, 0x00, sizeof(szData));

		if (vectorDeviceID.size() >= 3) {
			sprintf_s(szSubKey, 1024, "SYSTEM\\CurrentControlSet\\Enum\\DISPLAY\\%s\\%s\\Device Parameters", vectorDeviceID[1].c_str(), vectorDeviceID[2].c_str());
			std::cout << "KEY : " << "" << szSubKey << "" << std::endl;

			std::vector<BYTE> edid;
			result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSubKey, NULL, KEY_QUERY_VALUE, &hkey);
			if (result == ERROR_SUCCESS) {
				dwType = REG_BINARY;
				result = RegQueryValueEx(hkey, "EDID", NULL, NULL, (LPBYTE)szData, &sl);
				edid = bytes2Vector(szData);
				lstrcpyn(item.firmName, vectorDeviceID[1].c_str(), 260);
				std::cout << "\tEDID: " << "" << hexArrayString(szData, sizeof(szData)) << "\n" << std::endl;
			}
			RegCloseKey(hkey);

		}
	}

	item.isPrimary = mi.dwFlags;
	item.capsWidth  = GetDeviceCaps(hdc, DESKTOPHORZRES);
	item.capsHeight = GetDeviceCaps(hdc, DESKTOPVERTRES);
	item.metricsWidth = (mi.rcMonitor.right - mi.rcMonitor.left);
	item.metricsHeight = (mi.rcMonitor.bottom - mi.rcMonitor.top);
	list->push_back(item);

	index++;
	return true;
}

Defect

	if False:
        img = np.frombuffer(uintsBitmap, dtype='uint8')
        img.shape = (h, w, 4)
        if True:
            defect = np.uint8(img).copy()
            for i in range(len(defect)):
                for j in range(len(defect[i])):
                    tmp = defect[i][j][2]
                    defect[i][j][2] = defect[i][j][0]
                    defect[i][j][0] = tmp
            img = defect
	if False:
        img = np.frombuffer(uintsBitmap, dtype='uint8')
        img.shape = (h, w, 4)
        image = Image.fromarray(img)
        image = image.resize(narrow)
        zoomIn = np.asarray(image)
        if True:
            r = Image.fromarray(zoomIn[:, :, 2]).convert('L')
            g = Image.fromarray(zoomIn[:, :, 1]).convert('L')
            b = Image.fromarray(zoomIn[:, :, 0]).convert('L')
            image = Image.merge("RGB", (r, g, b))

在这里插入图片描述

<body onselectstart="return disableSelection()" ondblclick="disableDoubleClick()">
</body>
function disableSelection() {
    return false;
} 
function disableDoubleClick() {
    // NOTHING TODO
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值