检索作业对象的限制和作业状态信息.
#Include <WinAPIEx.au3>
_WinAPI_QueryInformationJobObject ( $hJob, $iJobObjectInfoClass, ByRef $tJobObjectInfo )
$hJob | 作业句柄.作业句柄. 句柄必须有 $JOB_OBJECT_QUERY 访问权限. 如果这个值是 0, 且调用进程与作业相关,并使用与作业相关的进程. |
$iJobObjectInfoClass | 查询限制的类信息.参数指定为 $tJobObjectInfo 结构类型, 有效值为: 1 - $tagJOBOBJECT_BASIC_ACCOUNTING_INFORMATION --- 包含作业对象的基本统计信息 2 - $tagJOBOBJECT_BASIC_LIMIT_INFORMATION --- 包含作业对象的基本限制的信息 3 - $tagJOBOBJECT_BASIC_PROCESS_ID_LIST --- 含了作业对象的标识符列表 4 - $tagJOBOBJECT_BASIC_UI_RESTRICTIONS --- 包含作业对象基本用户界面限制 5 - $tagJOBOBJECT_SECURITY_LIMIT_INFORMATION --- 用于作业系统指定的部分 8 - $tagJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION --- 包含作业对象基本统计和 I/O 统计信息 9 - $tagJOBOBJECT_EXTENDED_LIMIT_INFORMATION --- 包含作业对象基本的和扩展的限制信息 11 - $tagJOBOBJECT_GROUP_INFORMATION --- 指向一个缓冲区的指针 |
$tJobObjectInfo | 检索限制和工作状态信息的 $tagJOBOBJECT_* 结构. |
成功: | 返回写入 $tJobObjectInfo 参数指定结构的数据字节长度. |
失败: | 返回 0,并设置@error标志为非 0 值. |
在MSDN中搜索
#Include <APIConstants.au3>
#Include <WinAPIEx.au3>
Opt('MustDeclareVars', 1)
Global Const $sTemp = @TempDir & '\Test.au3'
Global $hFile
; 创建临时 .au3 文件
$hFile = FileOpen($sTemp, 2)
For $i = 1 To 3
FileWriteLine($hFile, 'Run(@SystemDir & "\calc.exe")')
Next
FileClose($hFile)
; 运行 "calc.exe" 3 次并等待您关闭所有的 3 个进程
_RunWaitEx(@AutoItExe & ' /AutoIt3ExecuteScript "' & $sTemp & '"')
; 删除临时 .au3 文件
FileDelete($sTemp)
Func _RunWaitEx($sCmd)
; 根据 amel27 的设想
Local $tProcess = DllStructCreate($tagPROCESS_INFORMATION)
Local $tStartup = DllStructCreate($tagSTARTUPINFO)
Local $tInfo = DllStructCreate($tagJOBOBJECT_BASIC_ACCOUNTING_INFORMATION)
Local $hJob, $hProcess, $hThread
$hJob = _WinAPI_CreateJobObject()
If @error Then
Return SetError(1, 0, 0)
EndIf
DllStructSetData($tStartup, 'Size', DllStructGetSize($tStartup))
If Not _WinAPI_CreateProcess('', $sCmd, 0, 0, 0, BitOR($CREATE_BREAKAWAY_FROM_JOB, $CREATE_SUSPENDED), 0, 0, DllStructGetPtr($tStartup), DllStructGetPtr($tProcess)) Then
Return SetError(1, _WinAPI_CloseHandle($hJob), 0)
EndIf
$hProcess = DllStructGetData($tProcess, 'hProcess')
$hThread = DllStructGetData($tProcess, 'hThread')
_WinAPI_AssignProcessToJobObject($hJob, $hProcess)
_WinAPI_ResumeThread($hThread)
_WinAPI_CloseHandle($hThread)
Do
If Not _WinAPI_QueryInformationJobObject($hJob, 1, $tInfo) Then
ExitLoop
EndIf
Sleep(100)
Until Not DllStructGetData($tInfo, 'ActiveProcesses')
_WinAPI_CloseHandle($hProcess)
_WinAPI_CloseHandle($hJob)
Return 1
EndFunc ;==>_RunWaitEx
Func _WinAPI_ResumeThread($hThread)
Local $Ret = DllCall('kernel32.dll', 'dword', 'ResumeThread', 'ptr', $hThread)
If (@error) Or (_WinAPI_DWordToInt($Ret[0]) = -1) Then
Return SetError(1, 0, -1)
EndIf
Return $Ret[0]
EndFunc ;==>_WinAPI_AssignProcessToJobObject