我有这个间歇性和不一致的问题,它已经让我发疯了很长时间:在我的一个程序中, 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
结果的实际含义。
更正代码片段后更新
我的猜测是您正面临其他一些应用程序访问剪贴板的竞争条件。我建议您检查一下您是否正在运行任何其他可能执行此操作的工具。