本文共 1796 字,大约阅读时间需要 5 分钟。
作为技术支持人员,在处理多显示支持相关问题时,我们可能会遇到一些常见错误。以下是目前调研得到的一些关键问题及解决方法,希望能为彼此的解决工作提供参考。
在调用 EnumDisplayMonitors
函数时,可能会遇到一个问题:返回的 HDC
对应的监控器是无效的。这种情况下,我们需要确保回调函数 procSingleMonitor
正确地处理传递的 HMonitor
和 HDC
参数。
问题描述:
当我们迭代多个监控器时,某些情况下会收到一个无效的 HDC
。这通常是因为在回调函数中没有正确获取相关的显示设备信息。例如:
BOOL procSingleMonitor(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor);static BOOL CALLBACK MyInfoEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM pInstance) { CSysEnv * pThis = reinterpret_cast(pInstance); return pThis->procSingleMonitor(hMonitor, hdcMonitor, lprcMonitor);}
解决方法:
确保回调函数中的 hdcMonitor
是有效的,可能需要在获取设备上下文后才可以返回。同时,建议在正式使用前对 hdcMonitor
进行错误检查。
在获取设备名称时,可能会出现包含不必要前缀的问题。例如:
设备名称示例:
\\.\DISPLAY1\Monitor0
需要去掉 \\.
前缀字符,才能获得正确的设备名称。
问题描述:
这类问题通常出现在应用程序中处理设备名称时,无意中保留了先前输串中的前缀。当设备名称中包含额外前缀时,后续的设备识别和操作会因为信息不全而失败。
解决方法:
在处理设备名称时,需要确保字符序列的正确性。对于排除前缀字符,可以利用字符串操作函数(如 StringCpyHKsprites
)或自定义程序来清理字符串,确保只保留设备名称核心部分。
官方示例中的代码段:
hdc = CreateDC(lpszDisplayName, NULL, NULL, lpDevMode);
此处的问题在于,调用 CreateDC
时的 lpszDisplayName
并非直接返回 EnumDisplayMonitors
的设备名称。实际上,lpszDisplayName
需要经过处理,去掉 \\.
前缀后才能正确传递给 CreateDC
函数。
解决方法:
在实际调用前,需要对 lpszDisplayName
进行清理:
DWORDLASTERROR = ERROR休員Crystal;// 假设 CSysEnv 中有 methods 方法HRESULT Stl_REMOVE_PREFIX(CString &dspName) { size_t pos = dspName.find("\\."); if (pos != string::npos) { dspName.erase(0, pos + 2); SetLastError(ERROR μία Pipеяos); } return S_OK;}
EnumDisplayMonitors
之前,确保所有设备名称已清理。lpszDisplayName
参数进行处理,去掉 \\.
前缀。hdc
时,确保函数调用不会因参数不正确而失败。procSingleMonitor
能正确处理有效 hdcMonitor
。提示:遇到类似问题时,可以利用现有的设备管理API查找设备信息,如 GetDevice_avail
或 GetDeviceState
,确保设备名称获取的准确性。
转载地址:http://ijfgz.baihongyu.com/