OK、これは以下に基づいています: CreateJobObject/SetInformationJobObject pinvoke in .net?
ジョブ オブジェクトを作成し、MS Word のインスタンスに添付しました。ジョブ オブジェクトには、UI 制限 WriteClipboard があります。私の推測では、これにより、人々がドキュメントからコピーするのを防ぐことができます。しかし、彼らはまだそれに貼り付けることができました。ただし、この制限だけでは、両方を行うことはできません。
AssignProcessToJobObject が完了すると、ジョブ オブジェクトがプロセス エクスプローラーのタブに正しく表示されるので、ジョブ オブジェクトが適用されていることがわかります。
LIMIT Read & Write クリップボード UI 制限を指定した場合、これが動作であると考えたでしょう。
上記のリンクからのコンストラクターは次のとおりです-UIRestrictionを追加しました-クリップバードの書き込み
public Job(string jobName)
{
handle = CreateJobObject(IntPtr.Zero, jobName);
var info = new JOBOBJECT_BASIC_LIMIT_INFORMATION
{
LimitFlags = 0x2000
};
var extendedInfo = new JOBOBJECT_EXTENDED_LIMIT_INFORMATION
{
BasicLimitInformation = info
};
int length = Marshal.SizeOf(typeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION));
IntPtr extendedInfoPtr = Marshal.AllocHGlobal(length);
Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false);
if (!SetInformationJobObject(handle, JobObjectInfoType.ExtendedLimitInformation, extendedInfoPtr, (uint)length))
throw new Exception(string.Format("Unable to set information. Error: {0}", Marshal.GetLastWin32Error()));
///UIRestrictions
var uiRestrictions = new JOBOBJECT_BASIC_UI_RESTRICTIONS
{
UIRestrictionsClass = 0x00000004 //No write to clipboard
};
length = Marshal.SizeOf(typeof(JOBOBJECT_BASIC_UI_RESTRICTIONS));
IntPtr basicUIInfoPtr = Marshal.AllocHGlobal(length);
Marshal.StructureToPtr(uiRestrictions, basicUIInfoPtr, false);
if (!SetInformationJobObject(handle, JobObjectInfoType.BasicUIRestrictions, basicUIInfoPtr, (uint)length))
throw new Exception(string.Format("Unable to set information. Error: {0}", Marshal.GetLastWin32Error()));
}
次に、メインプログラムで次のことを行います。
Job j = new Job("NewJob");
j.AddProcess(ProcID);
ProcID は、ジョブを追加するプロセスの ID です。ジョブを追加する前に、プロセスに既にジョブがあるかどうかを確認します。それ以外は、異常なエラーは発生しません。SysInternalstool と言うように、プロセス エクスプローラーにはプロセスに新しいジョブが関連付けられています。
そこに何かアイデアはありますか?