首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WcsGetDefaultColorProfile代码示例

WcsGetDefaultColorProfile代码示例
EN

Stack Overflow用户
提问于 2012-11-23 17:49:02
回答 6查看 2.1K关注 0票数 7

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

我想要一个C#的例子,但我会拿我能得到的任何东西。我在任何地方都找不到新的WCS概要文件管理功能的任何示例代码。

EN

回答 6

Stack Overflow用户

发布于 2014-12-03 02:11:58

我也遇到了同样的问题,您之所以感到沮丧,是因为MSDN文档在pDeviceName参数到WcsGetDefaultColorProfile的问题上是不正确的(至多是误导的)。

MSDN (http://msdn.microsoft.com/en-us/library/dd372247(v=vs.85).aspx表示pDeviceName指的是“设备的名称”,对于显示设备来说,这将被假定为窗口显示设备名称,如".\DISPLAY1",在DISPLAY_DEVICE结构的DeviceName参数中从EnumDisplayDevices返回。

实际上,这里需要的是监视器的DeviceKey参数,特别是在EnumDisplayDevices中使用EDD_GET_DEVICE_INTERFACE_NAME标志时获得的EDD_GET_DEVICE_INTERFACE_NAME。

因此,工作代码如下所示,假设szDisplayDeviceName已经设置为显示您所关心的设备名称,例如".\DISPLAY1":

代码语言:javascript
复制
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
    }
}
票数 5
EN

Stack Overflow用户

发布于 2015-01-12 02:26:17

跟进Matt上面的答案(谢谢!):如果您想要匹配其他应用程序,那么使用上面EnumDisplayDevices返回的第一个监视器。

但是请注意,这可能返回多监视器设置中的不正确(非活动/禁用)监视器,其中一个或多个监视器被禁用,但仍然连接。当然,微软不会在任何地方记录这一点,因此许多应用程序,包括Photoshop这样的大公司,在这方面都遭到了破坏:

如果您想做正确的事情,则必须多次调用EnumDisplayDevices,直到找到活动监视器为止(如果多个监视器与显示相关联,则标志DISPLAY_DEVICE_ACTIVE和DISPLAY_DEVICE_MULTI_DRIVER )。

票数 2
EN

Stack Overflow用户

发布于 2016-03-10 14:41:43

这些文档一点也不明显,但是从前面的答案中,我拼凑出了一个完整的解决方案(为了清晰起见,这里没有错误检查)。此外,这将只返回用户指定的默认设置,如果用户从未设置默认设置,则需要使用GetStandardColorSpaceProfile获取“其他”默认值。

代码语言:javascript
复制
DISPLAY_DEVICE displayDevice = {};
displayDevice.cb = sizeof(DISPLAY_DEVICE);

// First, find the primary adaptor
std::stringw adaptorName;
DWORD deviceIndex = 0;
while (::EnumDisplayDevicesW(nullptr, deviceIndex++, &displayDevice, EDD_GET_DEVICE_INTERFACE_NAME))
{
    if (displayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP &&
        displayDevice.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)
    {
        adaptorName = displayDevice.DeviceName;
        break;
    }
}

// Second, find the first active (and attached) monitor
std::string deviceName;
deviceIndex = 0;
while (::EnumDisplayDevicesW(adaptorName, deviceIndex++, &displayDevice, EDD_GET_DEVICE_INTERFACE_NAME))
{
    if (displayDevice.StateFlags & DISPLAY_DEVICE_ACTIVE &&
        displayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED)
    {
        deviceName = displayDevice.DeviceKey;
        break;
    }
}

// Third, find out whether to use the global or user profile
BOOL usePerUserProfiles = FALSE;
WcsGetUsePerUserProfiles(deviceName, CLASS_MONITOR, &usePerUserProfiles);

// Finally, get the profile name
const WCS_PROFILE_MANAGEMENT_SCOPE scope = usePerUserProfiles ? WCS_PROFILE_MANAGEMENT_SCOPE_CURRENT_USER : WCS_PROFILE_MANAGEMENT_SCOPE_SYSTEM_WIDE;

DWORD profileNameLength = 0; // In bytes
WcsGetDefaultColorProfileSize(scope, deviceName, CPT_ICC, CPST_RGB_WORKING_SPACE, 0, &profileNameLength);

wchar_t *const profileName = new wchar_t[profileNameLength / sizeof(wchar_t)];
WcsGetDefaultColorProfile(scope, deviceName, CPT_ICC, CPST_RGB_WORKING_SPACE, 0, profileNameLength, profileName);
// Do something with your profile name
delete[] profileName;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13533754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档