我有这个间歇性和不一致的问题,它已经让我发疯了很长时间:在我的一个程序中, 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()
}

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

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

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

如何解决或调试此类问题?

最佳答案

我进行了谷歌搜索,发现 someone else with a similar problem(向下滚动以找到特定响应),结果证明是由于重入。您是否在任何地方调用 EmptyClipboard() 然后对更改使用react?也许你有重入问题。

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

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

10-08 18:36