Jump to content

Set application in idle state


Recommended Posts

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

Link to comment
Share on other sites

; 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

 

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...