C# 从不同应用程序锁定/解锁剪贴板

C# 从不同应用程序锁定/解锁剪贴板,c#,.net,c#-4.0,ms-office,clipboard,C#,.net,C# 4.0,Ms Office,Clipboard,我有一个双办公室插件,它使用剪贴板进行通信,例如:将表格或图片从excel复制并粘贴到word。在“复制\粘贴”操作运行时,如果用户复制剪贴板中的内容,则可能会损坏剪贴板中的数据。在第一个应用程序中,我在复制之后尝试锁定剪贴板,在第二个应用程序中,我在粘贴之前尝试解锁剪贴板 我可以在一个应用程序中锁定剪贴板,但无法在另一个应用程序中解锁它 这是一个带有剪贴板包装器的类 public class MyClipboard { [DllImport("user32.dll",

我有一个双办公室插件,它使用剪贴板进行通信,例如:将表格或图片从excel复制并粘贴到word。在“复制\粘贴”操作运行时,如果用户复制剪贴板中的内容,则可能会损坏剪贴板中的数据。在第一个应用程序中,我在复制之后尝试锁定剪贴板,在第二个应用程序中,我在粘贴之前尝试解锁剪贴板

我可以在一个应用程序中锁定剪贴板,但无法在另一个应用程序中解锁它

这是一个带有剪贴板包装器的类

public class MyClipboard
    {
        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool OpenClipboard(IntPtr hwnd);

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool CloseClipboard();

        public void Close()
        {
            CloseClipboard();
        }

        public void Open()
        {
            OpenClipboard(IntPtr.Zero);
        }
    }
首次申请:

    MyClipboard clipboard = new MyClipboard();
                clipboard.Open();
    ...
 MyClipboard clipboard = new MyClipboard();
                clipboard.Close();
    ...
第二项申请:

    MyClipboard clipboard = new MyClipboard();
                clipboard.Open();
    ...
 MyClipboard clipboard = new MyClipboard();
                clipboard.Close();
    ...
如何从一个应用程序打开剪贴板,然后从另一个应用程序关闭剪贴板


谢谢

与其使用剪贴板在应用程序之间共享数据(正如您所说,用户可以修改剪贴板),不如使用

  • 共享已知文件(某些文件处于监视状态)可能会很慢
  • 命名管道(可能过于复杂)
  • WCF(大规模超压)
  • 内存映射文件(在.NET中可能是硬文件)
下面是一些其他的想法。。

如果您真的想使用剪贴板,您可以在格式中添加一些额外的自定义属性,以确保用户自己没有使用剪贴板。但以这种方式使用剪贴板似乎是不好的做法,但这是我的观点

嗯。
David

请共享
CloseClipboard()
的bool结果以及相应的
GetLastError()
。可能只能从
OpenClipboard
中指定的相同
HWND
调用
CloseClipboard
。请记住,提供剪贴板是为了方便用户,而不是程序员。您试图执行的操作(阻止用户使用剪贴板)是错误的。@ChrisThornton虽然您的观点通常是正确的,但office加载项访问的API与VBA脚本大致相同,这意味着它基本上只是用于用户自动化。有些封送的COM对象没有正确地公开给您的代码,但可以复制粘贴(例如,您可以通过复制粘贴来移动PPT幻灯片,但希望您能以任何其他方式移动它)。