У меня есть приложение, которое снимает скриншоты с локального компьютера. Это работает много лет назад, пока вдруг коллега не сообщил мне, что он получил ошибку «Недопустимый дескриптор» из моего приложения.Graphics.CopyFromScreen() и GetDC (0) завершают работу с «Недопустимый дескриптор»
Эта ошибка исходила из среды .NET с Graphics.CopyFromScreen()
.
Чтобы обойти это, я заменил эту функцию кодом C++, используя GetDC(GetDesktopWindow())
/GetDC(NULL)
и BitBlt()
, чтобы скопировать экран в растровое изображение. Теперь я получил ERROR_INVALID_HANDLE
.
Это происходит на Windows 7.
Что там происходит? Я не могу самостоятельно расследовать эту проблему, потому что я не могу ее воспроизвести, а мой коллега находится в другой стране.
Я искал в Google, и многие люди сообщают об этой ошибке. Но все сообщения, которые я нашел, были от людей, которые пытались сделать снимок экрана с клиентского компьютера через код ASP на сервере. Я не понимаю, как люди могут испытывать странное желание захватить компьютер клиента с веб-сайта. Очевидно, что это не сработает.
Но я не мог найти ни одного случая, когда кто-то сообщает об этой проблеме из приложения, которое не может захватить экран этого же компьютера в сеансе SAME, в котором работает приложение.
Это исключение почти всегда вызвано утечкой рукоятки, программа падает, когда ОС не позволяет процессу создавать больше или выгружается рабочая куча. Довольно диагностируется с помощью Диспетчера задач, вкладка «Процессы». Используйте «Вид»> «Выбрать столбцы» и отметьте «Пользовательские объекты» и «Объекты GDI». Устойчиво поднимающиеся числа заклинания обрекаются. –
Кажется, вы не читали мой ответ. – Elmue
Удаленные сеансы рабочего стола делят ваш экран. Это означает, что когда вы, например, сворачиваете приложение удаленного рабочего стола, больше нет экрана для захвата. Вы уверены, что проблема на самом деле происходит * все время? Он должен работать нормально, когда вы правильно подключены и когда приложение удаленного рабочего стола видимо и активно. Возможно, вам просто нужно обработать отказ изящно и возобновить работу, когда вы снова получите экран? – Luaan