При каких обстоятельствах GetClipboardData (CF_TEXT) возвращает NULL? - PullRequest
3 голосов
/ 19 января 2011

У меня есть эта периодически возникающая проблема, которая давно сводит меня с ума: в моей программе 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 ()?

Есть идеи, что может вызвать такое непоследовательное поведение?

Возможно ли, что какой-то другой процесс блокирует буфер обмена? Если да, то как мне его вернуть?

Как мне устранить неполадки или отладить что-то подобное?

Ответы [ 2 ]

3 голосов
/ 30 октября 2013

Используете ли вы WebRoot SecureAnywhere?Это функция Identity Shield автоматически очищает буфер обмена, если недопустимое приложение (в основном все, что не было предварительно одобрено) пытается извлечь текст из буфера обмена, который был помещен в буфер обмена защищенным приложением (включает в себя множество браузеров и почтовых клиентовдефолт).Когда это происходит, GetClipboardData(CF_TEXT) вернет NULL, даже если предыдущий вызов IsClipboardFormatAvailable(CF_TEXT) вернул true.

1 голос
/ 20 января 2011

Я выполнил поиск в Google и нашел кого-то еще с похожей проблемой (прокрутите вниз, чтобы найти конкретный ответ), которая, как оказалось, была вызвана повторным входом. Вы вызываете EmptyClipboard () где-нибудь, а затем реагируете на изменения? Возможно, у вас проблема с повторным входом.

Обновление после предоставленного фрагмента кода
В коде, который вы разместили, условие является неправильным перед вызовом GetLastError. Вы называете это только тогда, когда получаете результат, отличный от NULL, а не когда вы получаете NULL результат. Если вы исправите это, вы должны получить лучший ответ от GetLastError. Эта статья MSDN должна помочь в расшифровке того, что на самом деле означает результат GetLastError.

Обновление после исправленного фрагмента кода
Я предполагаю, что вы столкнулись с расой, когда какое-то другое приложение обращается к буферу обмена. Я бы порекомендовал проверить, есть ли у вас запущенные другие инструменты, которые могут это сделать.

...