DataFormats.GetFormat允许我创建一个新的私有格式吗?

时间:2017-01-21 05:47:54

标签: c# .net winforms base-class-library

我尝试了以下内容:

DataFormats.Format binaryData = DataFormats.GetFormat("BinaryData");

,返回的binaryData.Id为50151.

我可以假设" BinaryData"严格来说,这是一个私人名称,还是一个众所周知的名字?

我问,因为有一个第三方应用程序我正在与(colaSoft)接口,它将一个名为BinaryData的格式推送到剪贴板,同时Id也是50151.这只是一个巧合? Id如何确定?

1 个答案:

答案 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的生成方式而言,我不能回答那个部分 我无权访问该代码。