Здравствуйте все!!!
Все обстоит вот как...
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.
Сразу говорю - код не мой я в нем даж почти не ковырялся, потому что недостаточно хорошо знаю эту тему.
Хотелось бы аналогичную функцию, но для семерки. Лучше в исходнике, но советам тоже буду рад.
Заранее спасибо.