Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Скриншот в Vista

22K
02 апреля 2010 года
ChickenIdol
15 / / 27.03.2007
Пытаюсь сделать скриншот в программе.

Создаю поток :
 
Код:
thread = ::CreateThread( NULL, 0, func, &dwThrdParam, 0, &dwThreadId );


в func, в цикле с определенным таймаутом работает такой код:
Код:
HWND pDesctop = ::GetDesktopWindow();

const char * filePath = "c:\\temp.jpg";

HDC screenDC = NULL;
screenDC = GetDC( pDesctop );

HDC bufferDC = CreateCompatibleDC(screenDC);  
DWORD nWidth = GetDeviceCaps( screenDC, HORZRES );
DWORD nHeight = GetDeviceCaps( screenDC, VERTRES );

HBITMAP pDestPicture = ::CreateCompatibleBitmap(screenDC, nWidth, nHeight);

::SelectObject(bufferDC, pDestPicture);

BitBlt( bufferDC, 0, 0, nWidth, nHeight, screenDC, 0, 0, SRCCOPY | CAPTUREBLT);

CImage img;
img.Attach(pDestPicture);

img.Save( filePath, ImageFormatJPEG );

ReleaseDC( NULL, screenDC );
DeleteDC(bufferDC);

Все работает в XP, однако в Viste и Win 7 в файле сохраняется просто черный цвет.
Если код запустить вне потока - все отлично.

Есть мысль что это как то связано с ACL. Помогите.
8.2K
02 апреля 2010 года
bagie2
299 / / 26.10.2008
можно в отладчике поглядеть на каком этапе ошибка (что в LastError) после каждого вызова апи и, кстати, по поводу GetDC
Цитата:
If this value is NULL, GetDC retrieves the DC for the entire screen.

т.е. не обязательно вызывать GetDesktopWindow

и еще вот что. не знаю как насчет потоков, но логически рассуждая CImage.Attach вполне может пытаться делать SelectObject для pDestPicture, который уже выбран на bufferDC, что приводит к такому результату. хотя в таком случае и вне доп. потока не должен этот код работать. в общем проверьте. если так, то DeleteDC(bufferDC) можно переместить сразу после BitBlt

//added
и, кстати, DeleteObject я тут не увидел, а надо бы. и если GetDC( pDesctop ), то корректнее ReleaseDC( pDesctop, screenDC ). вполне может статься, что в потоке "глюк" связан именно с чем то этим, неправильным освобожением ресурсов. ну как вариант. и еще может лучше в try-finally блоки засунуть код

и нашел кое что о GetDC и в дополнение к предыдущему абзацу:

Цитата:
Note that the handle to the DC can only be used by a single thread at any one time.


направление мыслей улавливаете?

22K
02 апреля 2010 года
ChickenIdol
15 / / 27.03.2007
Спасибо, сейчас не все понял, тяжело доходит вечером, но обязательно отпишусь по результату.
22K
05 апреля 2010 года
ChickenIdol
15 / / 27.03.2007
Не туда смотрел.

Собственно поток запускается процессом, а процесс после висты, похоже не имеет доступа к рабочему столу пользователя.

И вот кусок документации:

Services have always run in session 0. Before Windows Vista, the first user to log on was also assigned to session 0. Now, session 0 is reserved exclusively for services and other applications not associated with an interactive user session. (The first user to log on is connected to session 1, the second user to log on is connected to session 2, and so on.) Session 0 does not support processes that interact with the user.

This change means that a service cannot post or send a message to an application and an application cannot send or post a message to a service. In addition, services cannot display a user interface item such as a dialog box directly. A service can use the WTSSendMessage function to display a dialog box in another session.

Т.е, как я понимаю все работает нормально, просто сервис получает свой собственный рабочий стол.
22K
16 апреля 2010 года
ChickenIdol
15 / / 27.03.2007
Не смотря на вышенаписанное, существуют такие функции как:
SetProcessWindowStation();
SetThreadDesktop();
SwitchDesktop(),
которые, по идее как раз и должны менять рабочий стол потока...

Однако у меня этого не вышло ни в коем разе.

Возможно ли в Vista и Win7, сделать скриншот экрана из сервиса?
И если возможно, удавалось ли кому то?
8.2K
16 апреля 2010 года
bagie2
299 / / 26.10.2008
вроде бы достаточно в настройках сервиса указать флаг "Разрешить взаимодействие с рабочим столом" и все должно работать
22K
19 апреля 2010 года
ChickenIdol
15 / / 27.03.2007
пробовал и включать эту опцию и запускать сервис под конкретным пользователем, не помогает
69K
25 февраля 2011 года
de_guta
1 / / 25.02.2011
Кто-нибудь разобрался в этой теме? аналогичная проблема возникла, черный десктоп при запуске из system сервиса
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог