博客
关于我
Windows多显示器创建DC的bug
阅读量:722 次
发布时间:2019-03-21

本文共 1796 字,大约阅读时间需要 5 分钟。

Windows 多显示支持 API 错误修复指南

作为技术支持人员,在处理多显示支持相关问题时,我们可能会遇到一些常见错误。以下是目前调研得到的一些关键问题及解决方法,希望能为彼此的解决工作提供参考。

1. EnumDisplayMonitors 返回无效的 HDC 监控器问题

在调用 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 进行错误检查。

2. 设备名称错误问题

在获取设备名称时,可能会出现包含不必要前缀的问题。例如:

设备名称示例:

\\.\DISPLAY1\Monitor0

需要去掉 \\. 前缀字符,才能获得正确的设备名称。

问题描述:

这类问题通常出现在应用程序中处理设备名称时,无意中保留了先前输串中的前缀。当设备名称中包含额外前缀时,后续的设备识别和操作会因为信息不全而失败。

解决方法:

在处理设备名称时,需要确保字符序列的正确性。对于排除前缀字符,可以利用字符串操作函数(如 StringCpyHKsprites)或自定义程序来清理字符串,确保只保留设备名称核心部分。

3. 官方示例中的问题及解决方法

官方示例中的代码段:

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/

    你可能感兴趣的文章
    Python中可用和使用的系统内存?
    查看>>
    python中存根文件(.pyi)的用途是什么?
    查看>>
    Python中实现ASCII码与字符相互转换
    查看>>
    Python中实现获取所有微信好友的头像并拼接成一张图片
    查看>>
    Python中对象的布尔值
    查看>>
    python中对集合的操作
    查看>>
    python中将列表转换为元组的时间复杂度,反之亦然
    查看>>
    Python中布尔表达式的求值
    查看>>
    python中很常用的10个内置函数整理(初学必备)
    查看>>
    python中打印二维列表数据
    查看>>
    python中打散数组shuffle
    查看>>
    Python中执行外部命令
    查看>>
    Python中拼接numpy数组-ChatGPT4o作答
    查看>>
    Python中提示:no module named 'PIL'
    查看>>
    Python中提示:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position
    查看>>
    python中数据类型存储_浅谈Python中的数据类型
    查看>>
    python中文件最重要的功能是什么-学 Python 都用来干嘛的?
    查看>>
    python中文版语言_高盛最新调查:Python超过汉语成为未来最重要技能,你准备学哪种编程语言?...
    查看>>
    Python中文问题SyntaxError
    查看>>
    Python中方括号和括号括起来的列表有什么区别?
    查看>>