Jump to content

Recommended Posts

Posted (edited)

Tsk is a CLI task lister that includes PIDs, process names, hWnds and window titles. The listing can be limited by supplying a substring of the process name or window title. Here is the usage:

TSK.exe: TaSK Lister|Switcher [CLD rev.2021-03-27]

Usage
-----
TSK [sub$tring]
  List running tasks: all tasks [tasks with process_names|window_titles matching sub$tring]
TSK /SW window_title(sub$tring)|PID|hWnd
  Switch focus to window with matching window_title(sub$tring)|PID|hWnd
TSK /?|/H
  Show this Help

And here's the code (compiled executable is HERE):

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile_type=exe
#AutoIt3Wrapper_Outfile=tsk.exe
#AutoIt3Wrapper_UseUpx=y
#AutoIt3Wrapper_Change2CUI=y
#AutoIt3Wrapper_Run_Au3Stripper=y
#AutoIt3Wrapper_AU3Check_Parameters=-w 3 -w 4 -w 5 -w 6 -d
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
;
; CLD rev.2021-03-27
AutoItSetOption("WinTitleMatchMode", -2)

Global $sSub = "", $sOut = "", $iC = 0, $aW, $bSwW = 0
Global $aWinList = WinList()

If $CmdLine[0] > 0 Then
    If StringInStr($CmdLineRaw, "/?") Or StringInStr($CmdLineRaw, "/H") Then
        Exit _ShowHelp()
    ElseIf StringInStr($CmdLineRaw, "/sw") Then
        $bSwW = 1
    Else
        $sSub = $CmdLine[1]
    EndIf
EndIf
If $CmdLine[0] > 1 Then
    For $i = 1 To 2
        If $CmdLine[$i] = "/sw" Then
            ContinueLoop
        Else
            $sSub = $CmdLine[$i]
        EndIf
    Next
EndIf   

If $bSwW = 1 Then
    If StringInStr($sSub, "0x") = 1 Then
        WinActivate(HWnd($sSub))
    ElseIf StringIsDigit($sSub) Then
        WinActivate(_GetHwndFromPID($sSub))
    Else
        $aW = WinList($sSub)
        If $aW[0][0] > 1 Then
            WinActivate($aW[2][1])
        Else
            ConsoleWrite("No matching window title for """ & $sSub & """" & @CRLF)
        EndIf
    EndIf
    Exit
EndIf

Global $aP = ProcessList()
Global $aW[1 + $aP[0][0]][1 + $aP[0][0]]
For $j = 1 To $aP[0][0]
    If String($aP[$j][1]) <> "" Then
        $aW[$j][0] = _GetHwndFromPID($aP[$j][1])
        $aW[$j][1] = WinGetTitle($aW[$j][0])
    Else
        $aW[$j][0] = ""
        $aW[$j][1] = ""
    EndIf
Next
Global $iX = 10
For $k = 1 To $aP[0][0]
    If $sSub Then
        If StringInStr($aP[$k][0], $sSub) = 0 Then
            If $aP[$k][1] Then
                If StringInStr($aW[$k][1], $sSub) = 0 Then ContinueLoop
            Else
                ContinueLoop
            EndIf
        EndIf
    EndIf
    If StringLen($aP[$k][0]) >= $iX Then $iX = 2 + StringLen($aP[$k][0])
Next
Global $sHdr = StringFormat("%7s", "PID") & "  " & StringFormat("%-" & $iX & "s", "Process") & StringFormat("%-12s", "hWnd") & "Window Title" & @CRLF
For $i = 1 To $aP[0][0]
    If $sSub Then
        If StringInStr($aP[$i][0], $sSub) = 0 Then
            If $aW[$i][0] Then
                If StringInStr($aW[$i][1], $sSub) = 0 Then ContinueLoop
            Else
                ContinueLoop
            EndIf
        EndIf
    EndIf
    $iC += 1
    $sOut &= StringFormat("%7s", $aP[$i][1]) & "  " & StringFormat("%-" & $iX & "s", $aP[$i][0]) & StringFormat("%-12s", $aW[$i][0]) & $aW[$i][1] & @CRLF
Next

If $iC > 0 Then
    If $CmdLine[0] = 0 Then $sOut &= @CRLF & "Command " & StringUpper(StringTrimRight(@ScriptName, 4)) & StringLower(StringRight(@ScriptName, 4)) & " /? for usage" & @CRLF
    ConsoleWrite($sHdr & $sOut)
Else
    ConsoleWrite("No matches" & @CRLF)
EndIf
Exit

Func _GetHwndFromPID($PID)
    Local $hWnd = 0
    Local $stPID = DllStructCreate("int")
    For $i = 1 To $aWinList[0][0]
        If $aWinList[$i][0] <> "" Then
            DllCall("user32.dll", "int", "GetWindowThreadProcessId", "hwnd", $aWinList[$i][1], "ptr", DllStructGetPtr($stPID))
            If DllStructGetData($stPID, 1) = $PID Then Return $aWinList[$i][1]
        EndIf
    Next
    Return $hWnd
EndFunc ;==>_GetHwndFromPID

Func _ShowHelp()
    Local $sTxt = StringUpper(StringTrimRight(@ScriptName, 4)) & StringLower(StringRight(@ScriptName, 4)) & ": TaSK Lister|Switcher [CLD rev.2021-03-27]" & @CRLF & @CRLF & "Usage" & @CRLF & "-----" & @CRLF & StringUpper(StringTrimRight(@ScriptName, 4)) & " [sub$tring]" & @CRLF & "  List running tasks: all tasks [tasks with process_names|window_titles matching sub$tring]" & @CRLF & StringUpper(StringTrimRight(@ScriptName, 4)) & " /SW window_title(sub$tring)|PID|hWnd" & @CRLF & "  Switch focus to window with matching window_title(sub$tring)|PID|hWnd" & @CRLF & StringUpper(StringTrimRight(@ScriptName, 4)) & " /?|/H" & @CRLF & "  Show this Help"
    ConsoleWrite($sTxt & @CRLF)
EndFunc  ;==>_ShowHelp

 

Edited by CarlD

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
×
×
  • Create New...