2017-01-21 5 views
1

私は次のことを試してみました:DataFormats.GetFormatを使用すると、新しいプライベートフォーマットを作成できますか?

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

と返さbinaryData.Idは50151.

である私は「BinaryData」は厳密に私にはプライベートな名前であるか、それはよく知られている名前であると仮定することはできますか?

私は(colaSoft)とインターフェイスしており、Idと同じフォーマットのBinaryDataもクリップボードにプッシュするサードパーティのアプリケーションがあるので質問します。それはちょうど偶然でしょうか? Idはどのようにして決定されますか? DataFormats.GetDataFormat Methodのドキュメントから

答えて

1

また、このメソッドは、新しいフォーマットを登録するために使用することができます。指定したフォーマットが見つからない場合は、自動的に新しいデータフォーマットとして登録されます。

これは、あなたの質問の一部にお答えしません:

私は「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を呼び出すことにより、登録された場合のフォーマットが存在しない場合、そのコードから気付くはずです。 RegisterClipboardFormat functionのドキュメントから今

[DllImport(ExternDll.User32, SetLastError=true, CharSet=System.Runtime.InteropServices.CharSet.Auto)] 
    [ResourceExposure(ResourceScope.None)] 
    public static extern int RegisterClipboardFormat(string format); 

:指定された名前を持つ登録フォーマットがすでに存在する場合

は、新しい フォーマットが登録されていないと、戻り値は、既存の フォーマットを識別する。これにより、複数のアプリケーションが同じ登録されたクリップボード形式を使用してデータ をコピー&ペーストできます。フォーマット名 の比較では大文字と小文字が区別されないことに注意してください。

登録されたクリップボードの形式は、 0xC000から0xFFFFの範囲の値で識別されます。

これはセッションごとにクリップボードが1つしかないことから、指定されたセッションでフォーマットIDが一般的であると推測できるはずです。

IDの生成方法については、私はその部分には答えられません 私はそのコードにアクセスできません。

関連する問題