各种剪贴板/拖放格式意味着什么?

时间:2010-08-13 16:50:10

标签: .net windows drag-and-drop clipboard

我正在玩拖拉。我制作了一个示例应用程序,并将文件从 My Music 中删除到我的应用程序中。这是e.Data.GetFormats()返回的内容:

  • Shell IDList Array
  • UsingDefaultDragImage
  • DragImageBits
  • DragContext
  • DragSourceHelperFlags
  • InShellDragLoop
  • FileDrop
  • FileNameW
  • 文件名
  • IsShowingLayered
  • DragWindow
  • IsComputingImage
  • DropDescription
  • DisableDragText
  • ComputedDragImage
  • IsShowingText

这些是什么意思以及如何解码和使用它们?

Google上的每一个都没有提供任何有用的信息。

2 个答案:

答案 0 :(得分:4)

DragImageBits 描述拖动内容时显示的图像。它的标题由SHDRAGIMAGE描述。

var data = e.Data.GetData("DragImageBits") as MemoryStream;
var buffer = new byte[24];
data.Read(buffer, 0, 24);
int w = buffer[0] + (buffer[1] << 8) + (buffer[2] << 16) + (buffer[3] << 24);
int h = buffer[4] + (buffer[5] << 8) + (buffer[6] << 16) + (buffer[7] << 24);
// Stride accounts for any padding bytes at the end of each row. For 32 bit
// bitmaps there are none, so stride = width * size of each pixel in bytes.
int stride = width * 4;
// x and y is the relative position between the top left corner of the image and
// the mouse cursor.
int x = buffer[8] + (buffer[9] << 8) + (buffer[10] << 16) + (buffer[11] << 24);
int y = buffer[12] + (buffer[13] << 8) + (buffer[14] << 16) + (buffer[15] << 24);
buffer = new byte[stride * h];
// The image is stored upside down, so we flip it as we read it.
for (int i = (h - 1) * stride; i >= 0; i -= stride) data.Read(buffer, i, stride);
BitmapSource.Create(w, h, 96, 96, PixelFormats.Bgra32, null, buffer, stride);

为了更好的兼容性,我们仍然应该使用DragDropHelper

答案 1 :(得分:1)

FileDrop是标准的,由DataFormats类覆盖。 Shell IDList和FileName / W对于Windows资源管理器是常见的。其余的都是定制的。根据他们的名字,当您拖动到其他Microsoft应用程序(如Media Player)时,听起来它们会增强D + D反馈。这些东西记录很少,可能是有意的。