Создание снимка экрана (BMP) с помощью службы Windows и CreateProcessWithLogonW

Я пытаюсь создать приложение для скриншотов с помощью службы Windows, которое может снимать весь экран через равные промежутки времени. Для начала я взял базовый пример оконной службы (http://code.msdn.microsoft.com/windowsdesktop/CppWindowsService-cacf4948), включил в проект служебный класс скриншота и вызвал функцию захвата в методе onStart образца службы Windows. Тем не менее, я получил пустые снимки экрана. Позже я понял, что служба Windows работает в другом сеансе, и поэтому скриншоты пусты.

S, я отделил служебный класс скриншотов и сделал его отдельным проектом и сгенерировал из него .exe (который способен записывать журналы в файл, где это необходимо). На этот раз я использовал функцию createProcessWithLogonW для вызова исполняемого файла, чтобы он запускал исполняемый файл в указанном пользовательском домене, а не в сеансе службы по умолчанию. Ниже приведен фрагмент кода, который я использовал.

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. Любая помощь приветствуется.


person paul zwerky    schedule 19.08.2013    source источник


Ответы (1)


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

person paul zwerky    schedule 30.08.2013