使用Windows服务和CreateProcessWithLogonW生成屏幕截图(BMP)

时间:2013-08-19 07:05:04

标签: c++ service screenshot interactive createprocessasuser

我正在尝试使用Windows服务创建一个屏幕截图应用程序,它可以定期捕获完整的屏幕。为了开始,我采用了基本的窗口服务示例(http://code.msdn.microsoft.com/windowsdesktop/CppWindowsService-cacf4948)并在项目中包含了截屏实用程序类,并在示例窗口服务的onStart方法中调用了捕获函数。但是,我得到了空白屏幕截图。后来我意识到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编程很新。任何形式的帮助都表示赞赏。

1 个答案:

答案 0 :(得分:0)

是的,我有那个工作。我们必须获取活动会话ID(可能来自打开的桌面)并在该会话上下文中将该过程作为交互式服务运行。这应该可以解决捕获屏幕截图问题。如果有人正在寻找GUI和服务交互,那么IPC将是最方便的方式。