Page 1 of 1

Another Process Monitor...

Posted: Sun Jul 20, 2003 10:01 pm
by LJ
Code updated for 5.20+

Code: Select all

;Process Monitor
;By GPI
;Modified by Lance Jepsen


Structure info
  handle.l
  process.l
  class$
  name$
EndStructure


Global NewList info.info()
Global NewList AllHandle()

Procedure.s GetClassName(handle)
  class$=Space(1024)
  GetClassName_(handle,@class$,Len(class$))
  ProcedureReturn Left(class$,Len(class$))
EndProcedure
Procedure.s GetTitle(handle)
  name$=Space(1024)
  GetWindowText_(handle,@name$,Len(name$))
  ProcedureReturn Left(name$,Len(name$))
EndProcedure
Procedure AddInfo(Handle)
  process=0
  GetWindowThreadProcessId_(handle,@process)
  Class$=GetClassName(handle)
  Name$=GetTitle(handle)
  
  ResetList(info())
  quit=0
  i=0
  Repeat
    If NextElement(info())
      If process < info()\process
        quit=1
      ElseIf process=info()\process
        If class$ < info()\class$
          quit=1
        ElseIf UCase(class$)=UCase(info()\class$)
          If name$ < info()\name$
            quit=1
          ElseIf UCase(name$)=UCase(info()\name$)
            If handle < info()\handle
              quit=1
            ElseIf handle=info()\handle
              quit=3
            EndIf
          EndIf
        EndIf
      EndIf
    Else
      quit=2
    EndIf
  Until quit
  If quit<3
    If quit=1
      If PreviousElement(info())=0: ResetList(info()) :EndIf
    EndIf
    AddElement(info())
    info()\handle=handle
    info()\process=process
    info()\class$=class$
    info()\name$=name$
  EndIf
EndProcedure
Procedure TerminateProcess(processid)
  process=OpenProcess_(#PROCESS_ALL_ACCESS,1,processid)
  If process
    TerminateProcess_(process,0)
    CloseHandle_(process)
  EndIf
EndProcedure

Procedure RefreshList()
  ClearGadgetItems(0)
  
  ClearList(allhandle())
  ClearList(info())
  handle=GetWindow_(WindowID(0),#GW_HWNDFIRST)
  ClearList(allhandle())
  quit=0
  Repeat
    AddInfo(handle)
    x=GetWindow_(handle,#GW_CHILD)
    If x
      AddElement(allhandle())
      allhandle()=x
    EndIf
    x=GetWindow_(handle,#GW_HWNDNEXT)
    If x
      handle=x
    Else
      If LastElement(allhandle())
        handle=allhandle()
        DeleteElement(allhandle())
      Else
        quit=1
      EndIf
    EndIf
  Until quit
  
  ResetList(info())
  
  
  While NextElement(info())
    If oldprocess<>info()\process
      oldprocess=info()\process
      a$=Hex(oldprocess)
    Else
      a$="              ''"
    EndIf
    AddGadgetItem(0,-1,a$+Chr(10)+info()\class$+Chr(10)+info()\name$+Chr(10)+Hex(info()\handle))
    
  Wend
  
  SetGadgetState(0,0)
EndProcedure

If OpenWindow(0,100,50,612,450,"Process Monitor",#PB_Window_SystemMenu)
  
  
  ListIconGadget(0, 30,125,550,300, "Process",70)
  AddGadgetColumn(0,1,"Class",210)
  AddGadgetColumn(0,2,"Name",250)
  AddGadgetColumn(0,3,"Handle",80)
  ButtonGadget(3, 256,30, 128,22,"Post Message")
  FrameGadget(2,252, 26,136,30,"",#PB_Frame_Single)
  FrameGadget(6,20, 70,570,370,"Windows")
  ButtonGadget(4, 395,90, 128,20,"Refresh List")
  TextGadget(5,90,8,60, 20, "Message")
  
  ComboBoxGadget(309, 30, 30, 200, 25)
  AddGadgetItem(309,0,"*Select*")
  AddGadgetItem(309,-1,"WM_DESTROY")
  AddGadgetItem(309,-1,"WM_CLOSE")
  AddGadgetItem(309,-1,"WM_QUIT")
  SetGadgetState(309,0)
  
  RefreshList()
  
  Repeat
    event=WaitWindowEvent()
    Select event
      Case #PB_Event_Gadget
        stat=GetGadgetState(0)
        If stat>-1
          SelectElement(info(),stat)
          stat=1
        Else
          stat=0
        EndIf
        
        Select EventGadget()
            
          Case 3;Post Message
            
            If  GetGadgetText(309)="WM_CLOSE"
              PostMessage_(info()\handle,#WM_CLOSE,0,0)
            EndIf
            
            If  GetGadgetText(309)="WM_DESTROY"
              PostMessage_(info()\handle,#WM_DESTROY,0,0)
            EndIf
            
            If  GetGadgetText(309)="WM_QUIT"
              PostMessage_(info()\handle,#WM_QUIT,0,0)
            EndIf
            
            
          Case 4
            RefreshList()
        EndSelect
    EndSelect
    
  Until event=#PB_Event_CloseWindow
EndIf