2

クリップボードからデバイスに依存しないビットマップを取得しようとしています。これは、.NET Frameworkに組み込まれているClipboard.GetData関数を介して実行できることをよく知っていますが、非常にバグがあるため(Web上の多くの場所で文書化されているように)、APIのみを使用したいと思います。

私は動作する次のコードを書きました。

//i can correctly cast this to a MemoryStream
MemoryStream ms = Clipboard.GetData("DeviceIndependentBitmap") as MemoryStream;

しかし、私はそれをAPIで使用したいと思います。これは、何らかの方法でストリームを指すポインター(IntPtr)を返すだけです。UnmanagedMemoryStreamを調べましたが、を正しく変換する方法を理解できていませんIntPtr

これが私のAPIコードです(フォーマットが引数として設定されているGetClipboardData APIを使用)。CF_DIB

IntPtr p = GetClipboardData(8);
//what do I do from here to get a MemoryStream from this pointer?

私は少し混乱しています。私はすでにそれを自分で調べましたが、何か役に立つものを思い付くことができませんでした。

4

1 に答える 1

7

あなたが使用できると言っUnmanagedMemoryStream(byte* pointer, long length)たように、それを使用するには、ポインタとバイトの長さが必要です。したがって、IntPtr.ToPointer()メソッドを使用してポインタを取得できますが、メモリコンテンツの長さを知っている必要があります。

UnmanagedMemoryStream unmanagedmemstream = UnmanagedMemoryStream(p.ToPointer(), 100);

バイトの配列を取得する別の方法がありますが、ここでも必要なメモリバイトの長さを知っている必要がありますMarshal.Copy(IntPtr source, byte[] destination, int startIndex,int length)

byte[] buffer = new byte[100];
Marshal.Copy(p , buffer, 0, buffer.Length);
于 2012-07-26T00:46:19.297 に答える