У меня есть эта неустойчивая и неустойчивая проблема, которая долгое время меня сводила с ума: в моей программе GetClipboardData (CF_TEXT) достигает 90% (или около того) времени, но время от времени это возвращает NULL.В каких обстоятельствах GetClipboardData (CF_TEXT) возвращает 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() возвращает «Операция завершена успешно», что еще я имею в своем наборе инструментов?Я попробую предложение Ганса вызвать EnumClipboardFormats(), но даже если он скажет мне, что CF_TEXT существует (или не существует), он не говорит мне * почему * он настолько противоречив. –