Я пытаюсь создать приложение для скриншотов, используя службу Windows, которая может снимать весь экран через регулярные промежутки времени. Для начала я взял базовый пример оконного сервиса (http://code.msdn.microsoft.com/windowsdesktop/CppWindowsService-cacf4948) и включил в проект служебный класс скриншотов и вызвал функцию захвата в методе onStart примера службы Windows. Тем не менее, я получил пустые снимки экрана. Позже я понял, что служба Windows работает в другом сеансе и, следовательно, скриншоты пустые.
S, я отделил класс утилиты для скриншотов, сделал его отдельным проектом и сгенерировал из него файл .exe (который способен записывать логи в файл, где это необходимо). На этот раз я использовал функцию createProcessWithLogonW для вызова исполняемого файла, чтобы он запускал exe-файл в указанном домене пользователя, а не в сеансе службы по умолчанию. Ниже приведен фрагмент кода, который я использовал.
void CSampleService::StartProcess()
{
DWORD dwSize; HANDLE hToken=NULL;
LPVOID lpvEnv; PROCESS_INFORMATION pi = {0};
STARTUPINFO si = {0};
WCHAR szUserProfile[256] = L"";
si.cb = sizeof(STARTUPINFO);
if (!CreateEnvironmentBlock(&lpvEnv, hToken, TRUE))
{
logger::Wlog(logger::fileName,"CreateEnvironmentBlock Error");
}
dwSize = sizeof(szUserProfile)/sizeof(WCHAR);
GetUserProfileDirectory(hToken, szUserProfile, &dwSize);
CreateProcessWithLogonW(L"admin", L"MyDomain",L"mypassword",
LOGON_WITH_PROFILE, NULL, L"C:\\Temp\\application.exe",
CREATE_UNICODE_ENVIRONMENT, lpvEnv, NULL, &si, &pi);
DestroyEnvironmentBlock(lpvEnv);
CloseHandle(hToken);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
У меня нет ошибок из логов, которые я получил. когда сервисы инициируются, он выдает предупреждение, что интерактивный сервис пытается показать сообщение. Когда я нажимаю на это, я снова получаю черный скриншот. Я знаю, что здесь задействовано много вещей, я просто высоко оценил то, что я делаю. Кроме того, я довольно новичок в программировании Windows. Любая помощь приветствуется.
да, у меня это работает. нам нужно получить активный идентификатор сеанса (возможно, с открытого рабочего стола) и запустить процесс как интерактивную службу в контексте этого сеанса. Это, вероятно, должно решить проблему захвата скриншотов. Если кто-то ищет GUI и сервисные взаимодействия, возможно, IPC будет наиболее удобным способом.
Других решений пока нет …