我尝试了以下内容:
DataFormats.Format binaryData = DataFormats.GetFormat("BinaryData");
,返回的binaryData.Id为50151.
我可以假设" BinaryData"严格来说,这是一个私人名称,还是一个众所周知的名字?
我问,因为有一个第三方应用程序我正在与(colaSoft)接口,它将一个名为BinaryData
的格式推送到剪贴板,同时Id
也是50151.这只是一个巧合? Id
如何确定?
答案 0 :(得分:1)
来自DataFormats.GetDataFormat Method的文档:
此方法也可用于注册新格式。如果找不到指定的格式,它将自动注册为新的数据格式。
这不回答你问题的部分:
我可以假设“BinaryData”严格来说是一个私人名称,或者它是一个众所周知的名字?
所以下一步是查看该方法的源代码。
public static Format GetFormat(string format) {
lock(internalSyncObject) {
EnsurePredefined();
// It is much faster to do a case sensitive search here. So do
// the case sensitive compare first, then the expensive one.
//
for (int n = 0; n < formatCount; n++) {
if (formatList[n].Name.Equals(format))
return formatList[n];
}
for (int n = 0; n < formatCount; n++) {
if (String.Equals(formatList[n].Name, format, StringComparison.OrdinalIgnoreCase))
return formatList[n];
}
// need to add this format string
//
int formatId = SafeNativeMethods.RegisterClipboardFormat(format);
if (0 == formatId) {
throw new Win32Exception(Marshal.GetLastWin32Error(), SR.GetString(SR.RegisterCFFailed));
}
EnsureFormatSpace(1);
formatList[formatCount] = new Format(format, formatId);
return formatList[formatCount++];
}
}
您应该从代码中注意到,如果通过调用声明为SafeNativeMethods.RegisterClipboardFormat
的{{1}}来注册该格式,则该格式不存在。
[DllImport(ExternDll.User32, SetLastError=true, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
[ResourceExposure(ResourceScope.None)]
public static extern int RegisterClipboardFormat(string format);
现在来自RegisterClipboardFormat function的文档:
如果已存在具有指定名称的注册格式,则为新的 格式未注册,返回值标识现有格式 格式。这使得多个应用程序可以复制和粘贴数据 使用相同的注册剪贴板格式。请注意格式名称 比较不区分大小写。
注册的剪贴板格式由范围中的值标识 0xC000到0xFFFF。
由此以及每个会话只有一个剪贴板的事实,您应该能够推断格式ID在给定会话中是常见的。
就ID的生成方式而言,我不能回答那个部分 我无权访问该代码。