1

我有一个问题,我只在网上看到过两三个关于它的帖子:当我在 C# 应用程序(Clipboard.SetText 或 Clipboard.Clear)中使用剪贴板时,Chrome 已经随机使用它,所以我的剪贴板请求失败。

System.Runtime.InteropServices.ExternalException: Requested Clipboard operation did not succeed. 
    at System.Windows.Forms.Clipboard.ThrowIfFailed(Int32 hr)
    at System.Windows.Forms.Clipboard.SetDataObject(Object data, Boolean copy, Int32 retryTimes, Int32 retryDelay)
    at System.Windows.Forms.Clipboard.SetText(String text, TextDataFormat format)
    at System.Windows.Forms.Clipboard.SetText(String text)

我关闭 Chrome,它可以工作,然后重新打开 Chrome,几分钟后,它仍然失败。我正在使用以下代码和 1 秒计时器和 GetOpenClipboardWindow(),另一个 PInvoke :(,以确认这确实是让我烦恼的 Chrome:

    [DllImport("user32.dll")]
    static extern IntPtr GetOpenClipboardWindow();

    [DllImport("user32.dll", SetLastError = true)]
    static extern int GetWindowThreadProcessId(IntPtr hWnd, out int 
    lpdwProcessId);


    IntPtr hwnd = GetOpenClipboardWindow();
    if (hwnd != IntPtr.Zero)
    {
        int processId;
        GetWindowThreadProcessId(hwnd, out processId);
        Process p = Process.GetProcessById(processId);
        listBox1.Items.Add(p.Modules[0].FileName);
    }

你们中是否有人已经遇到过这个问题?你知道为什么 Chrome 会偷剪贴板吗?

[编辑]

Chrome 团队的任何成员:亲爱的开发者,如果你今天读到这篇文章,请将我的剪贴板还给我,因为我在剪贴板上拥有比你更多的权利。为了你,我找了两天。

4

2 回答 2

3

恐怕没有什么可做的了,如果另一个进程打开了剪贴板,则在该进程关闭它之前无法释放它。

于 2012-05-12T20:05:07.937 回答
0

确保您的应用程序(因为最终,这就是您可以控制的全部)正在遵守规则。确保您没有在执行多个打开/关闭操作时进行。例如,如果您将多种格式放置到剪贴板上,请确保封装在一个打开/关闭块中,而不是两个。每当您在更新后关闭剪贴板时,都会生成剪贴板通知,从而触发其他应用程序(监视剪贴板)查看新数据。因此,请确保为每个预期操作生成一个此类事件(而不是多个)。不要创建意外操作(即在启动应用程序时不要打开/关闭剪贴板)。如果您刚刚更新了剪贴板,请不要

于 2012-05-14T13:08:21.917 回答