4

我有这个间歇性和不连贯的问题,这让我很长时间很疯狂:在我的一个程序中,GetClipboardData(CF_TEXT)有 90%(左右)的时间成功,但每隔一段时间它就会返回 NULL。

尽管 OpenClipboard() 在调用 GetClipboardData(CF_TEXT) 之前总是成功(并检查返回值),但还是会这样做。

请注意,90% 的成功率是针对同一页的!(即我知道那里有一个 CF_TEXT 内容)

注意:当它失败时,我立即调用 GetLastError() 但它返回的只是:“操作成功完成”

有问题的代码很简单:

if (::OpenClipboard(hwndW))
{
  HANDLE handleClip = ::GetClipboardData(CF_TEXT);
  if (handleClip == NULL)
    dw = GetLastError()
}

什么可能会将错误的 GetLastError() 代码注入其中?

知道什么会导致这种不一致的行为吗?

是否有其他进程正在锁定剪贴板?如果是这样,我该如何取回它?

如何解决或调试这样的问题?

4

2 回答 2

3

您在使用 WebRoot SecureAnywhere 吗?如果不允许的应用程序(基本上是任何未经预先批准的应用程序)尝试从剪贴板中检索由受保护的应用程序(包括许多浏览器和电子邮件客户端通过默认)。发生这种情况时,GetClipboardData(CF_TEXT)即使先前的调用IsClipboardFormatAvailable(CF_TEXT)返回 true,也会返回 NULL。

于 2013-10-30T07:16:58.260 回答
2

我进行了谷歌搜索,发现其他人有类似的问题(向下滚动以找到特定的响应),结果证明是由于重新进入。您是否在任何地方调用 EmptyClipboard() 然后对更改做出反应?也许你有一个重入问题。

提供代码片段后更新在
您发布的代码中,调用之前的条件是错误的GetLastError。您仅在获得非 NULL 结果时才调用它,而不是在获得NULL结果时调用它。如果你解决了这个问题,你应该得到更好的答案GetLastError这篇 MSDN 文章应该有助于解读结果的GetLastError实际含义。

更正代码片段后更新
我的猜测是您正面临与其他一些应用程序访问剪贴板的竞争条件。我建议检查您是否有任何其他可能执行此操作的工具正在运行。

于 2011-01-19T22:43:46.783 回答