![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() Здравствуйте! Пишу программу, которая должна делать снимок экрана (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 скриншот делается, если запускать программу через CreateProcessAsUser.
Цитата:
сам как запускаешь под SYSTEM? служба? Пишу программы за еду. __________________ |