Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.11.2011, 01:29
barmaley barmaley вне форума
Прохожий
 
Регистрация: 01.11.2011
Сообщения: 5
Репутация: 10
По умолчанию Не получается сделать 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  
Старый 01.11.2011, 01:33
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Используй 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  
Старый 01.11.2011, 02:00
barmaley barmaley вне форума
Прохожий
 
Регистрация: 01.11.2011
Сообщения: 5
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Используй 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;

Этот код нормально работает под обычной учетной записью. Но под учетной записью SYSTEM по прежнему получается только белый экран.
Ответить с цитированием
  #4  
Старый 01.11.2011, 02:02
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

У меня в XP, под любой учёткой нормально работает.
Не знаю зачем в VCL использовать GetSystemMetrics. Достаточно Screen.Width, Screen.Height.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 01.11.2011 в 02:04.
Ответить с цитированием
  #5  
Старый 01.11.2011, 02:14
barmaley barmaley вне форума
Прохожий
 
Регистрация: 01.11.2011
Сообщения: 5
Репутация: 10
По умолчанию

Screen.Width и Screen.Height не использую потому, что не хочу импортировать модуль Forms. Система тоже XP, но под учеткой SYSTEM не работает. Можно ли каким либо образом выполнить функцию с правами непривилегированного пользователя.
Ответить с цитированием
  #6  
Старый 01.11.2011, 02:18
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
не хочу импортировать модуль Forms
Достаточно того, что используется это:
Код:
Bmp: TBitmap;
Jpg: TJpegImage
Forms уже ничего не изменит. Хочешь компактности, используй WinAPI.

Не похоже, что дело в учётке, я постоянно работаю Администратором.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 01.11.2011 в 02:23.
Ответить с цитированием
  #7  
Старый 01.11.2011, 02:20
barmaley barmaley вне форума
Прохожий
 
Регистрация: 01.11.2011
Сообщения: 5
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
У меня в XP, под любой учёткой нормально работает.
Не знаю зачем в VCL использовать GetSystemMetrics. Достаточно Screen.Width, Screen.Height.

Screen.Width и Screen.Height не использую потому, что не хочу импортировать модуль Forms. Система тоже XP, но снимок под учеткой SYSTEM сделать не получается. Возможно ли выполнить функцию с другими правами?
Ответить с цитированием
  #8  
Старый 01.11.2011, 02:24
barmaley barmaley вне форума
Прохожий
 
Регистрация: 01.11.2011
Сообщения: 5
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Достаточно того, что используется это:
Код:
Bmp: TBitmap;
Jpg: TJpegImage
Forms уже ничего не изменит. Хочешь компактности, используй WinAPI.

Не похоже, что дело в учётке, я постоянно нахожусь в учётке SYSTEM.

Приложения, которые выполняются под SYSTEM отображаются только в списке процессов и не отображаются на экране, возможно из-за этого возникают непонятки с работой функций GetDC и GetWindowDC.
Ответить с цитированием
  #9  
Старый 01.11.2011, 02:30
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Попробуй для начала залить битмап одним цветом, например PatBlt, затем скопируй экран и посмотри, что находится в памяти битмапа.
Заодно проверь, получаешь ли контекст.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #10  
Старый 01.11.2011, 03:10
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Скорее всего дело в том, что у учетки SYSTEM нет десктопа как такового.
Т.е. тебе надо получить хэндл десктопа юзера и getDC(0) тебе тут не поможет.
Ответить с цитированием
  #11  
Старый 01.11.2011, 03:36
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Тогда его ничего не спасёт, так как 0 и есть хэндл десктопа.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #12  
Старый 01.11.2011, 08:38
Asmoday74 Asmoday74 вне форума
Прохожий
 
Регистрация: 12.10.2010
Адрес: Челябинск
Сообщения: 22
Версия Delphi: XE2
Репутация: 893
По умолчанию

Я так понимаю программа работает как служба?) Если да, поставь галку "разрешить взаимодействие с рабочим столом"
Ответить с цитированием
  #13  
Старый 01.11.2011, 08:43
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

тоже решил проверить. да, под SYSTEM скриншот делается, если запускать программу через CreateProcessAsUser.

Цитата:
Сообщение от barmaley
Как можно корректно сделать снимок экрана в контексте процесса запущенного от пользователя SYSTEM?

сам как запускаешь под SYSTEM? служба?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #14  
Старый 01.11.2011, 08:44
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Asmoday74
Я так понимаю программа работает как служба?) Если да, поставь галку "разрешить взаимодействие с рабочим столом"
В 7-й винде такой галки уже нет.
а что мешает из сервиса запустить клиентское ПО, которое будет делать скрины.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #15  
Старый 01.11.2011, 09:13
Asmoday74 Asmoday74 вне форума
Прохожий
 
Регистрация: 12.10.2010
Адрес: Челябинск
Сообщения: 22
Версия Delphi: XE2
Репутация: 893
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
В 7-й винде такой галки уже нет.
Ну в 7ке нету.
Думаю что тут первопричиной служит то, что системная учетная запись не имеет рабочего стола как такавого. Потому логичнее будет запускать от имени пользователя отдельный процесс ну или поток. Либо нужно как-то указывать скрин какова рабочего стола необходимо сделать.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:09.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter