|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Не получается сделать screenshot в программе запущенной под учетной записью SYSTEM
Здравствуйте! Пишу программу, которая должна делать снимок экрана (screenshot) и отправляет его на ftp-сервер. Проблема заключается в следующем: если программа запускается под простым пользователем - проблем не возникает, и она благополучно создает снимок, но если она запускается под пользователем SYSTEM, то в место снимка экрана получается, лишь белый квадрат и никакого изображения. Вероятней всего, API-функция GetWindowDC, не возвращает контекст устройства и из-за этого не получатся создать screenshot. Как можно корректно сделать снимок экрана в контексте процесса запущенного от пользователя SYSTEM?
Код:
function GetScreen: string; // функция создания снимка экрана var Bmp: TBitmap; Jpg: TJpegImage; ScreenImage: string; begin Bmp := TBitmap.Create; Jpg:= TJpegImage.Create; Bmp.Height := GetSystemMetrics(SM_CYSCREEN); Bmp.Width := GetSystemMetrics(SM_CXSCREEN); bitblt(Bmp.Canvas.Handle, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), GetWindowDC(0), 0, 0, SRCCOPY); Jpg.Assign(Bmp); ScreenImage := Format('%s%s_%s_%s.jpg', [GetTempDir, __GetUserName, DateToStr(Now), StringReplace(TimeToStr(Now), ':', '-', [rfReplaceAll])]); Jpg.SaveToFile(ScreenImage); Jpg.Free; Bmp.Free; result := ScreenImage; end; Последний раз редактировалось lmikle, 01.11.2011 в 03:08. |
#2
|
||||
|
||||
Используй GetDC(0), и не забывай освобождать контекст полученный таким образом.
Код:
DC := GetDC(0); try bitblt(Bmp.Canvas.Handle, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), DC, 0, 0, SRCCOPY); finally ReleaseDC(0, DC); end; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
|||
|
|||
Цитата:
Этот код нормально работает под обычной учетной записью. Но под учетной записью SYSTEM по прежнему получается только белый экран. |
#4
|
||||
|
||||
У меня в XP, под любой учёткой нормально работает.
Не знаю зачем в VCL использовать GetSystemMetrics. Достаточно Screen.Width, Screen.Height. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 01.11.2011 в 02:04. |
#5
|
|||
|
|||
Screen.Width и Screen.Height не использую потому, что не хочу импортировать модуль Forms. Система тоже XP, но под учеткой SYSTEM не работает. Можно ли каким либо образом выполнить функцию с правами непривилегированного пользователя.
|
#6
|
||||
|
||||
Цитата:
Код:
Bmp: TBitmap; Jpg: TJpegImage Не похоже, что дело в учётке, я постоянно работаю Администратором. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 01.11.2011 в 02:23. |
#7
|
|||
|
|||
Цитата:
Screen.Width и Screen.Height не использую потому, что не хочу импортировать модуль Forms. Система тоже XP, но снимок под учеткой SYSTEM сделать не получается. Возможно ли выполнить функцию с другими правами? |
#8
|
|||
|
|||
Цитата:
Приложения, которые выполняются под SYSTEM отображаются только в списке процессов и не отображаются на экране, возможно из-за этого возникают непонятки с работой функций GetDC и GetWindowDC. |
#9
|
||||
|
||||
Попробуй для начала залить битмап одним цветом, например PatBlt, затем скопируй экран и посмотри, что находится в памяти битмапа.
Заодно проверь, получаешь ли контекст. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#10
|
|||
|
|||
Скорее всего дело в том, что у учетки SYSTEM нет десктопа как такового.
Т.е. тебе надо получить хэндл десктопа юзера и getDC(0) тебе тут не поможет. |
#11
|
||||
|
||||
Тогда его ничего не спасёт, так как 0 и есть хэндл десктопа.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#12
|
|||
|
|||
Я так понимаю программа работает как служба?) Если да, поставь галку "разрешить взаимодействие с рабочим столом"
|
#13
|
||||
|
||||
тоже решил проверить. да, под SYSTEM скриншот делается, если запускать программу через CreateProcessAsUser.
Цитата:
сам как запускаешь под SYSTEM? служба? Пишу программы за еду. __________________ |
#14
|
||||
|
||||
Цитата:
а что мешает из сервиса запустить клиентское ПО, которое будет делать скрины. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#15
|
|||
|
|||
Цитата:
Думаю что тут первопричиной служит то, что системная учетная запись не имеет рабочего стола как такавого. Потому логичнее будет запускать от имени пользователя отдельный процесс ну или поток. Либо нужно как-то указывать скрин какова рабочего стола необходимо сделать. |