|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Скриншоты из службы под Win 7
Здравствуйте все!!!
Все обстоит вот как... 1)Есть программа, которая делает скриншоты и сохраняет их в *.png. 2)Естественно эта программа если запускать ее из под SYSTEM (сервис виндовс) нормально работать не может(и не только она), поэтому была написана другая программа, которая запускает эту в контексте активного рабочего стола. Так вот! В ХР все работает прекрасно: из службы делаем WinExec('runprc.exe scrsht.exe "scr.png"',0); то есть запускаем runprc.exe с параметром 'scrsht.exe "scr.png"' - и получаем скриншот в файле scr.png. Внимание, вопрос! Почему такой метод не работает в Win 7 ? Вот исходник программы runprc.exe Код:
program runprc; uses Windows, Messages, SysUtils, Classes, JwaWindows,//последние два модуля есть только в виде DCU файлов JwsclStrings;//если кто сможет помоч или заинтересуется - пишите в личку - вышлю, а то архив больше метра весит procedure StartApp(const App, Parameters, CurDir : TJwString); var StartupInfo:{$IFDEF UNICODE}TStartupInfoW{$ELSE}TStartupInfoA{$ENDIF}; ProcInfo:TProcessInformation; pEnv:Pointer; pCurDir, pCmdLine : TJwPChar; begin ZeroMemory(@StartupInfo,sizeof(StartupInfo)); StartupInfo.cb:=SizeOf(StartupInfo); StartupInfo.lpDesktop:='winsta0\default'; CreateEnvironmentBlock(@pEnv,0,true); try if Length(Parameters)>0 then pCmdLine:=TJwPChar('"'+App+'" '+Parameters) else pCmdLine := TJwPChar('"'+App+'"'); pCurDir:=Nil; if Length(CurDir)>0 then pCurDir:=TJwPChar(CurDir); if not {$IFDEF UNICODE}CreateProcessW{$ELSE}CreateProcessA{$ENDIF}( TJwPChar(App),//__in_opt LPCTSTR lpApplicationName, pCmdLine, //__inout_opt LPTSTR lpCommandLine, nil,//__in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes, nil,//__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, true,//__in BOOL bInheritHandles, CREATE_NEW_CONSOLE or CREATE_UNICODE_ENVIRONMENT,//in DWORD dwCreationFlags, pEnv,//__in_opt LPVOID lpEnvironment, pCurDir,//__in_opt LPCTSTR lpCurrentDirectory, StartupInfo,//__in LPSTARTUPINFO lpStartupInfo, ProcInfo//__out LPPROCESS_INFORMATION lpProcessInformation ) then raiseLastOsError; finally DestroyEnvironmentBlock(pEnv); end; CloseHandle(ProcInfo.hProcess); CloseHandle(ProcInfo.hThread); end; begin try StartApp(ParamStr(1),ParamStr(2),ParamStr(3)); except exit; end; end. Хотелось бы аналогичную функцию, но для семерки. Лучше в исходнике, но советам тоже буду рад. Заранее спасибо. Последний раз редактировалось makshimik, 25.05.2010 в 23:27. |
#2
|
|||
|
|||
потому что под 7 больше нет интерактивных служб. Точнее есть, но их заводить нужен специальный бубен.
|
#3
|
|||
|
|||
Так дайте же!!! Дайте же мне етот бубен!!!
Может быть есть какой-то способ запустить прогу не под SYSTEM, а под текущим пользователем??? Ведь нужна же все-таки интерактивность, причем довольно многим сервисам! Последний раз редактировалось makshimik, 26.05.2010 в 20:44. |
#4
|
||||
|
||||
Ну как вариант запустить из службы некий процесс под учеткой активного юзера. Ну или создать процесс от имени юзера, запустить в нем поток с твоим кодом.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#5
|
|||
|
|||
Цитата:
|