【问题标题】:Google Chrome stealing the Clipboard谷歌浏览器窃取剪贴板
【发布时间】:2012-05-12 07:24:27
【问题描述】:

我有一个问题,我只在网上看到过两三个关于它的帖子:当我在 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 团队的任何成员:亲爱的开发者,如果您今天阅读了这篇文章,请将我的剪贴板还给我,因为我在剪贴板上拥有比您更多的权利。因为你,我找了两天。

【问题讨论】:

标签: c# google-chrome clipboard chromium


【解决方案1】:

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

【讨论】:

  • 没错。看来我唯一能做的就是处理错误并等待 Chrome 完成它的工作。当时间过长时,我会告诉用户重新启动或关闭有罪的程序。
【解决方案2】:

确保您的应用(因为归根结底,这就是您可以控制的全部)遵守规则。确保您没有在执行多个打开/关闭操作时进行。例如,如果您将多种格式放置到剪贴板上,请确保封装在一个打开/关闭块中,而不是两个。每当您在更新后关闭剪贴板时,都会生成剪贴板通知,从而触发其他应用程序(监视剪贴板)查看新数据。因此,请确保为每个预期操作生成一个此类事件(而不是多个)。不要创建意外操作(即在启动应用程序时不要打开/关闭剪贴板)。而且,如果您刚刚更新了剪贴板,请不要指望您可以立即阅读剪贴板而不会与其他对来自窗口的通知消息做出反应的应用程序(wm_DrawClipboard 等)发生冲突

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-25
    • 2011-07-29
    • 2011-01-11
    • 1970-01-01
    • 2021-02-07
    • 2011-06-27
    相关资源
    最近更新 更多