【发布时间】:2011-01-19 20:26:49
【问题描述】:
我有这个断断续续的问题,这让我发疯了很长时间:在我的一个程序中,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() 代码?
知道什么会导致这种不一致的行为吗?
是否有其他进程正在锁定剪贴板?如果是,我该如何取回?
如何解决或调试此类问题?
【问题讨论】:
-
OpenClipboard() 不会告诉你任何事情。 EnumClipboardFormats() 告诉你什么?
-
你怎么知道内容还在剪贴板上?
-
@Jeff 这是个好问题。我“知道”它在那里,因为如果我再试一次(完全相同的页面)它会成功。这不是很“科学”,但是当 GetLastError() 返回“操作成功完成”时,我的工具包中还有什么?我将尝试 Hans 的调用 EnumClipboardFormats() 的建议,但即使它告诉我 CF_TEXT 存在(或不存在),它也不会告诉我为什么它是如此不一致。
-
我一直在研究我的一个类似(重复发生)的问题,几个月前读过这个帖子今天再次遇到它。就我而言,我不介意最后一个成功错误——只要我复制到剪贴板的最后一件事是空字符串,在已经清空剪贴板之后,我就会得到它。没有内容,不是失败,只是没有返回,错误成功。但是,我现在的问题是“空字符串副本”返回一个陈旧的最后一个错误“找不到文件”。 GetClipboardData 没有在空句柄上设置错误成功!现在我在调用之前设置了最后一个错误(0)。
标签: winapi clipboard clipboard-interaction