![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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; |
|
#3
|
|||
|
|||
|
Цитата:
Этот код нормально работает под обычной учетной записью. Но под учетной записью SYSTEM по прежнему получается только белый экран. |
|
#4
|
||||
|
||||
|
У меня в XP, под любой учёткой нормально работает.
Не знаю зачем в VCL использовать GetSystemMetrics. Достаточно Screen.Width, Screen.Height. Последний раз редактировалось angvelem, 01.11.2011 в 02:04. |
|
#5
|
|||
|
|||
|
Screen.Width и Screen.Height не использую потому, что не хочу импортировать модуль Forms. Система тоже XP, но под учеткой SYSTEM не работает. Можно ли каким либо образом выполнить функцию с правами непривилегированного пользователя.
|
|
#6
|
||||
|
||||
|
Цитата:
Код:
Bmp: TBitmap; Jpg: TJpegImage Не похоже, что дело в учётке, я постоянно работаю Администратором. Последний раз редактировалось angvelem, 01.11.2011 в 02:23. |
|
#7
|
|||
|
|||
|
Цитата:
Screen.Width и Screen.Height не использую потому, что не хочу импортировать модуль Forms. Система тоже XP, но снимок под учеткой SYSTEM сделать не получается. Возможно ли выполнить функцию с другими правами? |
|
#8
|
||||
|
||||
|
тоже решил проверить. да, под SYSTEM скриншот делается, если запускать программу через CreateProcessAsUser.
Цитата:
сам как запускаешь под SYSTEM? служба? |