windows - WcsGetDefaultColorProfile 的代码示例

标签 windows winapi color-profile color-management

有没有人有一个工作代码示例显示调用 Windows 颜色系统函数 WcsGetDefaultColorProfile 以获取特定设备的默认颜色配置文件?当我为 pDeviceName 参数传递 null 时,它对我有用,但是当我尝试传递监视器的设备名称时,我总是得到错误代码 ERROR_FILE_NOT_FOUND。

我更喜欢 C# 示例,但我会使用我能得到的任何东西。我在任何地方都找不到更新的 WCS 配置文件管理功能的任何示例代码。

最佳答案

我遇到了同样的问题,让您感到沮丧的原因是 MSDN 文档关于 WcsGetDefaultColorProfile 的 pDeviceName 参数不正确(或者充其量是误导性的)。

MSDN 文档 ( http://msdn.microsoft.com/en-us/library/dd372247(v=vs.85).aspx ) 表明 pDeviceName 指的是“设备名称”,对于显示设备,人们会假设它是一个 Windows 显示设备名称,例如“\.\DISPLAY1”,如在来自 EnumDisplayDevices 的 DISPLAY_DEVICE 结构的 DeviceName 参数。

其实这里需要的是monitor的DeviceKey参数,具体是EnumDisplayDevices中使用EDD_GET_DEVICE_INTERFACE_NAME标志时得到的DeviceKey。

所以工作代码看起来像这样,假设 szDisplayDeviceName 已经设置为显示您关心的设备名称,例如“\.\DISPLAY1”:

WCHAR szPath[MAX_PATH];
DISPLAY_DEVICE dd;
dd.cb = sizeof(dd);
if (EnumDisplayDevices(szDisplayDeviceName, 0, &dd, EDD_GET_DEVICE_INTERFACE_NAME))
{
    if (WcsGetDefaultColorProfile(WCS_PROFILE_MANAGEMENT_SCOPE_CURRENT_USER, 
          dd.DeviceKey,
          CPT_ICC,
          CPST_PERCEPTUAL,
          1,  // dwProfileID -- doesn't seem to matter what value you use here
          MAX_PATH * sizeof(WCHAR),
          szPath))
    {
        PROFILE profile;
        profile.cbDataSize = (DWORD)(wcslen(szPath) + 1) * sizeof(WCHAR);
        profile.dwType = PROFILE_FILENAME;
        profile.pProfileData = (PVOID)szPath;

        HPROFILE hProfile = OpenColorProfile(&profile,
           PROFILE_READ, FILE_SHARE_READ, OPEN_EXISTING);

        // now do something with the profile
    }
}

关于windows - WcsGetDefaultColorProfile 的代码示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13533754/

相关文章:

windows - Qt 静态链接和部署

c# - 如何在 C# 中使用 GetNextWindow()?

c++ - 在 Windows 7 中读取注册表行为异常

image-processing - 颜色配置文件在图形程序中的作用

c - 使用 Go 和 OpenCV 读取/写入图像中的 ICC 配置文件

c++ - HANDLE 和 DCB 的 Linux 实现

c++ - 您可以将 LPTSTR 转换为 BSTR 吗?

windows - VBS 和正则表达式

c - 当 EventLogProvider 不包含消息表时如何读取 Windows 事件消息