Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение снимка экрана в сервисе 
:(
    Опции темы
nda
  Дата 15.2.2016, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 28.3.2011

Репутация: нет
Всего: нет



Добрый день. Народ подскажите пожалуйста.
Пишу сервис для винды, суть его очень просто через определенное время делает снимок экрана. Но проблема в следующем когда запускаю сервис мне вместо снимков экрана сохраняется белый фон, а когда тот же код запускаю с переложения все нормально. 
Вот код
Код

procedure TService1.Timer1Timer(Sender: TObject);
var
 Bmp:TBitmap;
 Screen:TCanvas;
 R:TRect;
 WinSta:HWINSTA;
 Desk:HDESK;
begin
 GetDesktopWindow;
 WinSta:=OpenWindowStation('WinSta0',False,WINSTA_READSCREEN);
 SetProcessWindowStation(WinSta);
 Desk:=OpenDesktop('Default',0,False,DESKTOP_SWITCHDESKTOP);
 SetThreadDesktop(Desk);
 Bmp:=TBitmap.Create;
 Bmp.Width:=1024;
 Bmp.Height:=768;
 Screen:=TCanvas.Create;
 Screen.Handle:=GetDC(0);
 R:=Rect(0,0,1023,767);
 Bmp.Canvas.CopyRect(R,Screen,R);
 ReleaseDC(0,Screen.Handle);
 Screen.Free;
 Bmp.SaveToFile('d:\'+inttostr(kol)+'.bmp');
 Bmp.Free;
 kol:=kol+1;
end;


и еще вот такой использовал

Код

var bmp: TBitmap;
    jpg: TJpegImage;
begin
  bmp := TBitmap.Create;
  jpg:=TJpegImage.Create;
  try
    bmp.Width := Screen.Width;
    bmp.Height := Screen.Height;
    BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, GetDC(GetDesktopWindow), 0, 0, SRCCopy);
//    Clipboard.Assign(bmp);
    bmp.SaveToFile('D:\2.bmp');
      {создаем экземпляр объекта}

    {присваиваем ему изображение}
     jpg.Assign(bmp);
     {устанавливаем степень сжатия (качество) 1..100}
     jpg.CompressionQuality:=50;
    {Упаковываем графику}
     jpg.Compress;
    {и сохраняем ее куда вам захочется}
     jpg.SaveToFile('D:\1.jpg');
    {уничтожаем экземпляр объекта}


  finally
    bmp.Free;
    jpg.free;
  end;


Подскажите как сделать так чтобы с сервиса (службы) тоже снимок экрана делался нормально.
PM MAIL   Вверх
kami
Дата 15.2.2016, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



если коротко - то никак.

А теперь немножко подробнее:
у каждого пользователя в Windows - своя сессия, свой рабочий стол, свой экран. Это же относится и к сервисам - у них свой рабочий стол под учетной записью LOCAL SYSTEM (или другой - в зависимости от типа логина). Времена, когда сервис мог подключиться к активной сессии пользователя минули с окончанием эры Windows XP. Начиная с Vista разделение жесткое, без права на амнистию. Разные сессии не могут получить доступ к объектам друг друга. Это относится в том числе к Inter-process communications - самый распространенный механизм (Send и PostMessage) не работает между сессиями. Остаются другие способы (MMF, NamedPipes, TCP/IP...), но у них нужно явно указывать права доступа.

К чему я это все? Непосредственно из сервиса сделать снимок активного рабочего стола нельзя - у него другая сессия. Для того, чтобы совершить подобное сервису нужно:
1. Запустить новый "обычный" процесс от имени активной учетки.
2. Соединиться с ним через любой вид межпроцессного взаимодействия, позволяющий работать из разных сессий
3. Отправить команду в приложение "дай мне снимок экрана" и получить от нее данные.

На форуме есть темы, как сделать это всё. Емнип, в основном - в разделе WinAPI. Поищите...
PM MAIL WWW   Вверх
nda
Дата 25.2.2016, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 28.3.2011

Репутация: нет
Всего: нет



спасибо за помощь kami.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0805 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.