Jump to content

Recommended Posts

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
Link to post
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
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By emendelson
      I have a script that runs another application (vDos.exe), and the same script can be run multiple times to open other instances of the same vDos.exe application.
      When I open a new instance of vDos.exe, I want to make sure that its window does not open directly over a previous instance, so I want to get the window positions of previous instances. Has someone written a method of finding the PIDs of all instances of the same executable, so that I can get the window positions of each of them?
      I've found various application counters in the forum, but they seem to be designed to find multiple instances of the script, not of another application.
      Many thanks for any pointers.
       
    • By gspino
      I hoping some of you young people can help an old man get off the nickel...  I have a small project I'd like to complete before I retire.  My problem is that on a terminal server environment I need to be able to detect the PID of a process by 'process name' AND 'process owner' so I can kill that specific process and not affect others who may be running the same process in another session.    I can seem to do one or the other but not both.  Can anyone please point me in the right direction?  Thanks very much in advance. -Glen
    • By TryWare90Days
      I'm trying to kill a malware process, that I can't remove with my www.sophus.com/hom antivirus.

      The malware is known as coinminer,config and my Sophus only creates popups of blocking the malware.

      I know that the malware is constantly launching a svchost *32.exe processes, where the svchost.exe processes are from my Windows 7 operating system.
      I have with no luck tried to do this:
      Global $_bStatus = False
      While $_bStatus = False
                 Global $_iPid
                 Global $_sActiveTitleNew = "svchost *32.exe"
                 $_iPid = WinGetProcess($_sActiveTitleNew)
                 If $_iPid <> -1 Then $_bStatus = ProcessClose($_iPid)   
      Wend
      EXIT
       
      But the $_iPid doesn't ever show anything else than  -1, even if I can see the svchost *32.exe process in my TaskManager
       
      YES - I know I shouldn't EXIT after killing the first malware detection, but it is easier to explain the above for you, so I can get a solution.
    • By BlazerV60
      Hello all,
      I've written the code below which launches chrome in incognito mode and then proceeds to go to the autoit website.
      From my understanding, the Run() command is also supposed to output the PID number related to the application that got launched from the Run command.
      However when I run the below lines, it outputs a PID number that is different from the newly launched chrome browser's PID number, does anyone know why and possibly explain how I could retrieve the accurate PID number associated with the newly launched browser?
      Global $iPid = Run(@ComSpec & ' /c start chrome.exe https://www.autoitscript.com/forum/ -incognito' ,"", "") msgbox(0,"",$iPid) Thank you,
      Brian
    • By ur
      I have created below code to run the python file.
      #RequireAdmin #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Icon=icon.ico #AutoIt3Wrapper_Outfile=RunTaskRun.Exe #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #cs ---------------------------------------------------------------------------- AutoIt Version: 3.3.14.0 Author: Uday Kiran Reddy(ur) Script Function: To log python data to a file. #ce ---------------------------------------------------------------------------- #include <MsgBoxConstants.au3> #include "C:\Automation\ISMBuild\Library.au3" #include "ProcessEx_AddedNewEntryForLogging.au3" #include "CheckChangeinCommit.au3" If not NoChangesRequired() Then SendMail("Changes are in commit of erwin-main Repo","Will intimate once binaries are copied to Installshield machine") $hProcessHandle = _Process_RunCommand($PROCESS_RUN, $PROCESS_COMMAND & "C:\Python27\python.exe C:\BuildServer\AutoBuildServer\TaskRun.py") ; Capture the Process Handle $iPID = @extended ; Note the PID $returncode = _Process_DebugLogRunCommand($hProcessHandle, $iPID) ; Display the results in real-time Logging("Completed with ReturnCode "&$returncode) Else SendMail("No Changes are not there in commit of erwin-main Repo","So no Binaries for today.If it is needed, please remove the text file from location: "& @TempDir&"\git_erwin_commit.txt") EndIf When I kill the autoit execution exe in the middle of execution, it is not terminating the python.exe launched from script.
      Can you suggest how to do this?
×
×
  • Create New...