david1337 Posted March 1, 2016 Posted March 1, 2016 Hi guys I have a script that runs for about 20 seconds. If Outlook.exe is not already open, and I open it while the script is running, I want Outlook to wait until the script is done, and then open. Is it possible to set an application in some sort of idle state until the script is done? I want to avoid it from just closing Outlook, and open it again. Thanks David
johnmcloud Posted March 1, 2016 Posted March 1, 2016 expandcollapse popup; Johnmcloud - 2016 ; _GetAllProcessThreads by monoceres, a little edited Local $iPID = Run("notepad") Sleep(1000) _ProcessSuspend($iPID) Sleep(2000) _ProcessResume($iPID) Func _ProcessSuspend($iPID) Local $THREAD_SUSPEND_RESUME = 0x0002 Local $hWnd, $aProcessThreads = _GetAllProcessThreads($iPID) For $i = 1 To $aProcessThreads[0][0] $hWnd = DllCall('Kernel32.dll', 'hwnd', "OpenThread", "int", $THREAD_SUSPEND_RESUME, "int", 0, 'int', $aProcessThreads[$i][0]) If Not @error Then DllCall('Kernel32.dll', 'uint', "SuspendThread", 'hwnd', $hWnd[0]) Next Return 1 EndFunc ;==>_ProcessSuspend Func _ProcessResume($iPID) Local $THREAD_SUSPEND_RESUME = 0x0002 Local $hWnd, $aProcessThreads = _GetAllProcessThreads($iPID) For $i = 1 To $aProcessThreads[0][0] $hWnd = DllCall('Kernel32.dll', 'hwnd', "OpenThread", "int", $THREAD_SUSPEND_RESUME, "int", 0, 'int', $aProcessThreads[$i][0]) If Not @error Then DllCall('Kernel32.dll', 'uint', "ResumeThread", 'hwnd', $hWnd[0]) Next Return 1 EndFunc ;==>_ProcessResume Func _GetAllProcessThreads($iPID) Local Const $TH32CS_SNAPTHREAD = 0x00000004 Local Const $THREADENTRY32 = "dword dwSize;dword cntUsage;dword th32ThreadId;dword th32OwnerProcessID;long tpBasePri;long tpDeltaPri;dword dwFlags;" Local $aCall = DllCall("Kernel32.dll", "ptr", "CreateToolhelp32Snapshot", "dword", $TH32CS_SNAPTHREAD, "dword", 0) If @error Then Return SetError(1, 0, 0) Local $hThread = $aCall[0] Local $aReturn[1][3] Local $Thread32 = DllStructCreate($THREADENTRY32) DllStructSetData($Thread32, "dwSize", DllStructGetSize($Thread32)) $aCall = DllCall("Kernel32.dll", "int", "Thread32First", "ptr", $hThread, "ptr", DllStructGetPtr($Thread32)) If @error Then Return SetError(2, 0, 0) If DllStructGetData($Thread32, "th32OwnerProcessID") = $iPID Then _GetAllThreads_ArrHelper($aReturn, $Thread32) Do $aCall = DllCall("Kernel32.dll", "int", "Thread32Next", "ptr", $hThread, "ptr", DllStructGetPtr($Thread32)) If Not $aCall[0] Then ExitLoop If DllStructGetData($Thread32, "th32OwnerProcessID") = $iPID Then _GetAllThreads_ArrHelper($aReturn, $Thread32) Until True And False $aReturn[0][0] = UBound($aReturn) - 1 ; number of items in the array DllCall("Kernel32.dll", "bool", "CloseHandle", "handle", $hThread) If @error Then Return SetError(3, 0, 0) Return $aReturn EndFunc ;==>_GetAllProcessThreads Func _GetAllThreads_ArrHelper(ByRef $aArray, $Thread32_Struct) Local $iUBound = UBound($aArray) ReDim $aArray[$iUBound + 1][3] $aArray[$iUBound][0] = DllStructGetData($Thread32_Struct, "th32ThreadId") $aArray[$iUBound][1] = DllStructGetData($Thread32_Struct, "th32OwnerProcessID") $aArray[$iUBound][2] = DllStructGetData($Thread32_Struct, "tpBasePri") EndFunc ;==>_GetAllThreads_ArrHelper
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now