2

我已经阅读了很多关于剪切/复制到剪贴板的主题,但还没有找到我的问题的答案

我正在开发像 Windows 资源管理器这样的“文件管理器”应用程序。文件在列表视图中以详细信息视图列出。

我有 CUT/COPY/PASTE 操作,我知道如何使用 File.Move、.Copy、Clipboard.GetFileDropList()、.SetFileDropList()............而且效果很好。

我不知道的是我如何以及在哪里可以在内存中写入(哪种方法)以及如何从内存(剪贴板)中读取上次使用的操作,剪切或复制?内存 Windows 资源管理器中是否有任何字符串,我可以读取然后知道它是 CUT 还是 COPY?

我想让用户能够从我的应用程序中剪切/复制以赢得资源管理器,反之亦然。

4

3 回答 3

1

如果您想确定上次调用哪个剪贴板操作,我认为您必须收听 Windows 消息,特别是 WM_CUT (0x0300) 与 WM_COPY (0x0301),并跟踪上次发送/接收的消息。您可以覆盖MSDNControl.WndProc上讨论的方法。

以下是 Windows 消息的更多参考链接:

剪贴板消息

WM_CUT

WM_COPY

于 2011-01-27T06:51:22.237 回答
0

您用于Clipboard.SetText将文本添加到剪贴板(复制),并Clipboard.GetText从剪贴板检索文本(粘贴)。

这里有一篇文章应该可以帮到你。

此外,关于文件的复制/粘贴,请参阅SO 问题:

于 2011-01-27T06:31:00.647 回答
0

使用这个主题我写了这段代码:

private const string DROP_EFFECT = "Preferred DropEffect";

private void CmdPaste()
{
  DataObject data = Clipboard.GetDataObject() as DataObject;
  var obj = data.GetData(DROP_EFFECT);
  bool isCut = false;
  if (obj != null)
  {
    if (obj is MemoryStream) //from Windows
    {
      var m = (obj as MemoryStream).ToArray();
      isCut = m[0] == 2;
    }
    else
      isCut = obj.ToString() == "Move";
  }

  PasteItems(data.GetFileDropList(), Path, isCut); //here start operation with items
}

private void ItemsToClipboard(StringCollection items, bool isCut)
{
  DataObject data = new DataObject();
  data.SetFileDropList(items);
  if (isCut)
    data.SetData(DROP_EFFECT, DragDropEffects.Move);
  else
    data.SetData(DROP_EFFECT, DragDropEffects.Copy);
  Clipboard.Clear();
  Clipboard.SetDataObject(data);
}
于 2021-11-03T07:20:54.867 回答