Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 在什么情况下GetClipboardData(CF_TEXT)将返回NULL?_Winapi_Clipboard_Clipboard Interaction - Fatal编程技术网

Winapi 在什么情况下GetClipboardData(CF_TEXT)将返回NULL?

Winapi 在什么情况下GetClipboardData(CF_TEXT)将返回NULL?,winapi,clipboard,clipboard-interaction,Winapi,Clipboard,Clipboard Interaction,我有一个断断续续的、不一致的问题,这个问题已经让我发疯很长时间了:在我的一个程序中,GetClipboardData(CF_TEXT)在90%左右的时间内成功,但每隔一段时间它就会返回NULL 尽管OpenClipboardData()在调用GetClipboardData(CF_TEXT)之前总是成功(并且返回值已检查) 请注意,90%的成功率适用于相同的页面!(即,我知道那里有一个CF_文本内容) 注意:当它失败时,我立即调用GetLastError(),但它返回的结果是:“操作成功完成”

我有一个断断续续的、不一致的问题,这个问题已经让我发疯很长时间了:在我的一个程序中,GetClipboardData(CF_TEXT)在90%左右的时间内成功,但每隔一段时间它就会返回NULL

尽管OpenClipboardData()在调用GetClipboardData(CF_TEXT)之前总是成功(并且返回值已检查)

请注意,90%的成功率适用于相同的页面!(即,我知道那里有一个CF_文本内容)

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

所讨论的代码非常简单:

if (::OpenClipboard(hwndW))
{
  HANDLE handleClip = ::GetClipboardData(CF_TEXT);
  if (handleClip == NULL)
    dw = GetLastError()
}
有什么可能会将错误的GetLastError()代码注入到该文件中

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

是否可能有其他进程正在锁定剪贴板?如果是,我该如何收回


如何排除或调试类似的问题?

我在谷歌上搜索并发现(向下滚动以查找特定的响应),结果是由于重新进入。您是否在任何地方调用EmptyClipboard(),然后对更改做出反应?也许你有重新进入的问题

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

更正代码段后更新

我的猜测是,当其他应用程序访问剪贴板时,您将面临竞争条件。我建议您检查一下是否有其他运行的工具可以做到这一点。

您是否使用WebRoot SecureAnywhere?如果不允许的应用程序(基本上是未经预先批准的任何应用程序)试图从剪贴板检索由受保护的应用程序(默认情况下包括许多浏览器和电子邮件客户端)放置到剪贴板上的文本,则其Identity Shield功能会自动清空剪贴板。发生这种情况时,
GetClipboardData(CF\u TEXT)
将返回NULL,即使之前对
IsClipboardFormatAvailable(CF\u TEXT)
的调用返回true。

OpenClipboard()不会告诉您任何信息。EnumClipboardFormats()告诉你什么?你怎么知道内容仍然在剪贴板上?@Jeff这是个好问题。我“知道”它就在那里,因为如果我再试一次(同一页),它就会成功。这并不是很“科学”,但当GetLastError()返回“操作已成功完成”时,我的工具箱中还有什么?我将尝试Hans关于调用EnumClipboardFormats()的建议,但即使它告诉我CF_文本存在(或不存在),它也不会告诉我为什么它如此不一致。我一直在处理一个类似的(重复出现的)问题,几个月前读过这个线程,今天又遇到了它。在我的例子中,我不介意最后一个成功的错误——在清空剪贴板后,只要我最后复制到剪贴板的是空字符串,我就会得到它。没有内容,没有失败,只是没有返回,错误成功。但是,我现在的问题是“空字符串副本”返回一个过时的最后一个错误“找不到文件”。GetClipboardData未在空句柄上设置错误成功!现在我在调用之前设置了LastError(0)。@Jeff很抱歉没有提到,当然我调用了GetLastError()。这是它返回的结果:“操作已成功完成”。我对此完全感到困惑。@Android Eve:我已经根据其他信息修改了我的答案。@Jeff+1用于此链接。知道我的计划,我想你有点。。。不,我不调用EmptyClipboard(),但我确实调用CloseClipboard()--这不是更好吗?此外,即使我忘记调用空/关闭函数,为什么GetLastError()返回“成功”?Android Eve:不幸的是,GetLastError返回当前线程上最后一次调用SetLastError时设置的最后一个错误,而不是您一定要看到的最后一个错误。如果您有一个重入问题,它很可能会返回除GetClipboardData之外的其他API调用的最后一个错误。还有,可能是最后一个错误不是由调用设置的。@Jeff:在这种情况下,您如何定义“重新进入问题”呢?这花了我一个下午的时间试图找出我的程序出了什么问题。用户正在运行WebRoot,这与我的问题和解决方案完全匹配。我们无法确定是什么在为我们的软件中的一个用户清除剪贴板的CF_文本部分。就是这样!谢谢你为我们节省了很多时间。