是否有人有一个工作代码示例,显示对Windows系统函数WcsGetDefaultColorProfile的调用,以获取特定设备的默认颜色配置文件?当我为pDeviceName参数传递null时,它对我有效,但是当我试图传递监视器的设备名称时,我总是得到ERROR_FILE_NOT_FOUND的错误代码。
我想要一个C#的例子,但我会拿我能得到的任何东西。我在任何地方都找不到新的WCS概要文件管理功能的任何示例代码。
发布于 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":
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
}
}发布于 2015-01-12 02:26:17
跟进Matt上面的答案(谢谢!):如果您想要匹配其他应用程序,那么使用上面EnumDisplayDevices返回的第一个监视器。
但是请注意,这可能返回多监视器设置中的不正确(非活动/禁用)监视器,其中一个或多个监视器被禁用,但仍然连接。当然,微软不会在任何地方记录这一点,因此许多应用程序,包括Photoshop这样的大公司,在这方面都遭到了破坏:
如果您想做正确的事情,则必须多次调用EnumDisplayDevices,直到找到活动监视器为止(如果多个监视器与显示相关联,则标志DISPLAY_DEVICE_ACTIVE和DISPLAY_DEVICE_MULTI_DRIVER )。
发布于 2016-03-10 14:41:43
这些文档一点也不明显,但是从前面的答案中,我拼凑出了一个完整的解决方案(为了清晰起见,这里没有错误检查)。此外,这将只返回用户指定的默认设置,如果用户从未设置默认设置,则需要使用GetStandardColorSpaceProfile获取“其他”默认值。
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;https://stackoverflow.com/questions/13533754
复制相似问题