Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > cскриншот из сервиса


Автор: artfully 17.11.2008, 00:34
скажите возможно ли из сервиса сделать скриншот экрана пользователя который в данный момент работает под своей учетной записью.. если да то подскажите в какую сторону копать...

Автор: artfully 17.11.2008, 02:27
только не предлогайте сделать его интерактивным... ведь тогда он под вистой работать не будет... а это уже оч плохо

Автор: ReInit 17.11.2008, 05:30
копать в сторону
OpenDesktop
SetThreadDesktop

Автор: CompWorm 17.11.2008, 18:02
а сервис разве не для всех активных учеток срабатывает? 
а в шедулер сапихнуть вашу прогу?

Автор: ReInit 17.11.2008, 20:46
CompWorm, 
для всех, но у него другой рабочий стол

Автор: Virtuals 18.11.2008, 05:52
ReInit, неее у него другая рабочая станция smile 

artfully, 
форум, любезно тебе подсказал, очень полезные ссылки внизу страници smile 
ЗЫ //я тащусь от плагина данного движка "А здесь смотрели?" smile 

Автор: artfully 18.11.2008, 18:38
Цитата(Virtuals @ 18.11.2008,  05:52)
artfully, 
форум, любезно тебе подсказал, очень полезные ссылки внизу страници smile 
ЗЫ //я тащусь от плагина данного движка "А здесь смотрели?" smile

если вы про эту http://forum.vingrad.ru/forum/topic-50907.html
то тут все решатеся  путем включения интерактивного режима... в висте это работать не будет.. а мне нужно что бы и там работало...
(кстати я об этом уже упомянал)


to ReInit:
прошу прощения но не могли бы вы пока зать как ими пользоваться.. просто я пока так и не свомог понять как соединить воедино функцию снимка экрана и OpenDesktop
SetThreadDesktop  smile 

снимок экрана делается по примеру из DRKB

Код

function GetScreenShot(const AHandle: THandle; Wsize:integer;const CompressPercent: Byte;var AImage: TJPEGImage): Boolean;
var
fBitmap: TBitmap;
DC: HDC;
Rect: TRect;
begin
Result := False;
if AImage = nil then Exit;
DC := GetDC(AHandle);
if DC <> 0 then
try
   fBitmap := TBitmap.Create;
   nb := TBitmap.Create;
   try
     if not GetClientRect(AHandle, Rect) then Exit;
     fBitmap.Width := Rect.Right - Rect.Left;
     fBitmap.Height := Rect.Bottom - Rect.Top;
     fBitmap.PixelFormat := pf32bit;
     Result := BitBlt(fBitmap.Canvas.Handle, 0, 0, fBitmap.Width,
       fBitmap.Height, DC, 0, 0, SRCCOPY);
     if not Result then Exit;
     AImage.Assign(fBitmap);
     AImage.CompressionQuality := CompressPercent;
   finally
     fBitmap.Free;
     nb.Free;
   end;
finally
   ReleaseDC(AHandle, DC);
end;
end;

procedure ScreenPhoto(nstr:TMemoryStream;WSize:integer);
var
  Image: TJPEGImage;
begin
  Image := TJPEGImage.Create;
  try
     if GetScreenShot(GetDesktopWindow,WSize, 90, Image) then
     image.SaveToStream(nstr);
  finally
    Image.Free;
  end;
end;

Автор: Virtuals 18.11.2008, 21:53
artfully, 
пожалусто прочтите все ссылки внизу страници, и попробуйте осмыслить чем отличается сервис с галкой "интерактивный" от сервиса без галки
//зы просто легче потом дать обьяснение
зызы имхо неохота даватьготовое, главное показать путь smile 

Автор: artfully 18.11.2008, 23:31
да я понимаю что если сервис интерактивный то у него есть возможность так сказать общаться с пользователем... это все хорошо из под ХР ... но как же тогда в Висте сделать все тожесамое что и в ХР , ведь, повторюсь, интерактивный сервис в висте не работает.

И еще, чтобы лучше была понятна сама ситуация обьясню подробнее что за программу я пишу.
Это программа которая делает через хзаданное время скрин экрана и отсылает его пользователю... (примитивное подобие рабмина).
программу я написал и решил переделать ее в сервис по тому как она должа отсылать скрины рабочих столов вне зависимости от того какой пользователь сейчвас работает. Если же реализовывать это как обычную программу то возможна следующая ситуация:

Пользователь А1 зашел в свою учетную запись и программи П1 запустилась , открыла порт 123 и начала транслировать что пользователь делает в данную минуту. потом пользователь СМЕНИЛ учетную запись (главное здесть то что перая учетная запись продолжает работать) , тут запустилась вторая копия программы ... НО теперь она уже не может открыть порт 123 по тому что по нему уже идет трансляция рабочего стола старой учетной записи....
Вот по этому я решил переделать прогу в сервис чтобы она работала вне зависимости от учетной записи.. но теперь возникает проблемма как сделать так чтобы этот сервис работал также и в висте!!!!!!

Автор: artfully 19.11.2008, 00:14
кстати может кто обресует какая картина обстоит в висте... там теперь сервис вообще никак не сможет связаться с пользователем или там просто какие то другие механизмы взаимодействия!!!

Автор: Virtuals 19.11.2008, 06:43
artfully, 
Цитата

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

 smile 
интерактивный сервис отличается от неинтерактивного...

неинтерактивный= 
станция - "блаблабла" (короче набор случайных символов)
стол - "default"

интерактивный=
станция - "WinSta0"
стол - "default" /обычно для пользователя
стол - "winlogon" /для винлогона, ну тот стол где стрл альт дел жмеш и вводиш логин пароль

соответственно чтобы процесс стал "интерактивным" smile ну и слово же выдумали нужно всего то 
SetProcessWindowStation и SetThreadDesktop.
если ломимся к пользоватилю, -то стол - "default", если на экран входа в  систему то стол - "winlogon"

ЗЫ ну а если не хватает терпения или еще чего то может просто 
CreateProcess снимокэкрана.ехе с параметром lpDesktop - WinSta0\default

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)