0

我正在尝试使用 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 编程很陌生。任何形式的帮助表示赞赏。

4

1 回答 1

0

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

于 2013-08-30T11:56:27.693 回答