1

我正在尝试使程序在作业对象上下文中运行,但是在对作业设置限制之后,当我从不在作业中的其他程序复制某些内容时,然后返回我的程序并尝试使用 ctrl+ v 或右键菜单粘贴,作业上下文中的程序将不粘贴任何内容。

但在其他情况下,例如当我从我的程序中复制某些内容并将其粘贴到我的程序或其他程序中的某个位置时,它会正常运行。

我开始研究工作对象几天,这对我来说很奇怪,因为我没有设置 JOB_OBJECT_UILIMIT_WRITECLIPBOARD 或 JOB_OBJECT_UILIMIT_READCLIPBOARD 的限制。你能告诉我如何解决这个问题吗?谢谢!

我的系统是 Windows 7 64 位,这是导致此问题的代码:

#include "stdafx.h"
#include <windows.h>

#define exePath L"c:\\windows\\notepad.exe"

int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE hJob = CreateJobObject( NULL , NULL );
    JOBOBJECT_BASIC_UI_RESTRICTIONS jobbuir;
    jobbuir.UIRestrictionsClass  = JOB_OBJECT_UILIMIT_NONE;

    jobbuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_DESKTOP;
    jobbuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_EXITWINDOWS;
    jobbuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS; 

    SetInformationJobObject(hJob, JobObjectBasicUIRestrictions, &jobbuir, sizeof(jobbuir));

    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi;
    BOOL bResult = CreateProcess(
         exePath, L"" , NULL, NULL, FALSE,
         CREATE_SUSPENDED | CREATE_BREAKAWAY_FROM_JOB |
         CREATE_UNICODE_ENVIRONMENT | DETACHED_PROCESS , NULL, NULL, &si, &pi
    );
    AssignProcessToJobObject(hJob, pi.hProcess);
    ResumeThread(pi.hThread);
    CloseHandle(pi.hThread);

    HANDLE h[2];
    h[0]=pi.hProcess;
    h[1]=hJob;

    DWORD dw = WaitForMultipleObjects(2, h, FALSE, INFINITE);

    CloseHandle(pi.hProcess);
    CloseHandle(hJob);
    return 0;
} 

爆香

4

0 回答 0