Seite 1 von 1

App Liste mit Infos

Verfasst: 08.02.2021 21:42
von Zerosurf
So, hab jetzt mal was zusammen gebastelt. Falls ihr Verbersserungsvorschläge habt - nur her damit!

Ich hoffe, es hilft dem Einen oder Anderen so wie es mir geholfen hat! Danke an die Community hier, dich mich sehr unterstützt hat!

Code: Alles auswählen

EnableExplicit

Define a, event
Global PID
Global MODULEENTRY32.MODULEENTRY32
Global Snapshot

Procedure ListWindows(hwnd,lParam)
  Protected.s title = Space(1000),class = Space(1000)
  If GetWindowLong_(hwnd,#GWL_EXSTYLE) ! #WS_EX_TOOLWINDOW And GetWindowLong_(hwnd,#GWL_STYLE) & #WS_VISIBLE
    GetClassName_(hwnd,class,1000)
    GetWindowText_(hwnd,title,1000)
    If title <> ""
      MODULEENTRY32\dwSize = SizeOf(MODULEENTRY32)
      GetWindowThreadProcessId_(FindWindow_(0,title), @PID)
      Snapshot = CreateToolhelp32Snapshot_(#TH32CS_SNAPMODULE, PID)
      If Module32First_(Snapshot, MODULEENTRY32)
        ;Debug PeekS(@MODULEENTRY32\szExePath)
        ;Debug "Title: "+title+" | Class: "+class+" | Handle: "+Str(hwnd)+" | App: "+GetFilePart(PeekS(@MODULEENTRY32\szExePath))+" | Path: "+PeekS(@MODULEENTRY32\szExePath)
        AddGadgetItem (0, -1, title+Chr(10)+class+Chr(10)+Str(hwnd)+Chr(10)+GetFilePart(PeekS(@MODULEENTRY32\szExePath))+Chr(10)+PeekS(@MODULEENTRY32\szExePath)) 
        Define a
      EndIf
      CloseHandle_(Snapshot)
    EndIf
  EndIf
  ProcedureReturn #True
EndProcedure

Procedure.I GetSelectedColumn(ListIconID.I)
  Protected CursorLocation.POINT
  Protected HitInfo.LVHITTESTINFO
  GetCursorPos_(CursorLocation)
  MapWindowPoints_(0, GadgetID(ListIconID), CursorLocation, 1)             
  Hitinfo\pt\x = CursorLocation\x
  HitInfo\pt\y = CursorLocation\y
  SendMessage_(GadgetID(ListIconID), #LVM_SUBITEMHITTEST, 0, HitInfo)
  ProcedureReturn HitInfo\iSubItem 
EndProcedure

If OpenWindow(0, 0, 0, 1010, 250, "Process Info:", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
  ; WindowBounds(0, 1010, 200, #PB_Ignore, #PB_Ignore)
  TextGadget(1, 5, 5, 1000, 20, "RightClick to copy cell content to clipboard", #PB_Text_Center)
  ListIconGadget(0, 5, 30, 1000, 190, "Title", 200, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_GridLines)
  AddGadgetColumn(0, 1, "Class", 240)
  AddGadgetColumn(0, 2, "Handle", 60)
  AddGadgetColumn(0, 3, "Program", 200)
  AddGadgetColumn(0, 4, "Path", 500)
  ButtonGadget(2, 455, 225, 100, 20, "Refresh")
  EnumChildWindows_(FindWindow_("ToolbarWindow32",0),@ListWindows(),0)
  ;SetGadgetState(0, 0)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
      Case #PB_Event_Gadget
        If EventGadget() = 0 And EventType() = #PB_EventType_RightClick
          Debug GetGadgetItemText(0, -1, GetSelectedColumn(0)) + ": " + GetGadgetItemText(0, GetGadgetState(0), GetSelectedColumn(0))
          SetClipboardText(GetGadgetItemText(0, GetGadgetState(0), GetSelectedColumn(0)))
          MessageRequester("Information", "Copied " + GetGadgetItemText(0, -1, GetSelectedColumn(0)) + ": " + Chr(13) + Chr(13) + GetGadgetItemText(0, GetGadgetState(0), GetSelectedColumn(0)) + Chr(13) + Chr(13) + "to clipboard!")
        EndIf
        If EventGadget() = 2 And EventType() = #PB_EventType_LeftClick
          RunProgram(ProgramFilename())
          End
        EndIf
    EndSelect
  ForEver
  
EndIf


Re: App Liste mit Infos

Verfasst: 09.02.2021 08:49
von dige
Danke für das Beispiel. Damit alle Prozesse angezeigt werden, muss es mit x64 compiliert werden.

Re: App Liste mit Infos

Verfasst: 09.02.2021 09:22
von Zerosurf
dige hat geschrieben:Danke für das Beispiel. Damit alle Prozesse angezeigt werden, muss es mit x64 compiliert werden.
Danke für den Hinweis!

Re: App Liste mit Infos

Verfasst: 09.02.2021 16:42
von Axolotl
Hi Zerosurf,
ich konnte nicht widerstehen und musste Deiner Aufforderung folgen...
Was ich anders machen würde habe ich im Code vermerkt.
Generell verwende ich immer Konstanten für Fenster und Controls (#WINDOW_Main, #GADGET_List, etc. ) in meinen Programmen.
Lässt sich m.M.n. leichter pflegen.

Code: Alles auswählen

EnableExplicit

Define a, event
Global PID
Global MODULEENTRY32.MODULEENTRY32
Global Snapshot

Procedure ListWindows(hwnd,lParam)
  Protected.s title = Space(1000),class = Space(1000)
;' changes by AHa 
;' If GetWindowLong_(hwnd,#GWL_EXSTYLE) ! #WS_EX_TOOLWINDOW And GetWindowLong_(hwnd,#GWL_STYLE) & #WS_VISIBLE
;' MSDN: Note  If you are retrieving a pointer or a handle, this function has been superseded by the GetWindowLongPtr function. 
;'       (Pointers and handles are 32 bits on 32-bit Windows and 64 bits on 64-bit Windows.) To write code that is compatible 
;'       with both 32-bit and 64-bit versions of Windows, use GetWindowLongPtr. 
  If GetWindowLongPtr_(hwnd, #GWL_EXSTYLE) ! #WS_EX_TOOLWINDOW And GetWindowLongPtr_(hwnd, #GWL_STYLE) & #WS_VISIBLE 
;' End of changes 
    GetClassName_(hwnd,class,1000) 
    GetWindowText_(hwnd,title,1000)
    If title <> ""
      MODULEENTRY32\dwSize = SizeOf(MODULEENTRY32)
      GetWindowThreadProcessId_(FindWindow_(0,title), @PID)
      Snapshot = CreateToolhelp32Snapshot_(#TH32CS_SNAPMODULE, PID)
      If Module32First_(Snapshot, MODULEENTRY32)
        ;Debug PeekS(@MODULEENTRY32\szExePath)
        ;Debug "Title: "+title+" | Class: "+class+" | Handle: "+Str(hwnd)+" | App: "+GetFilePart(PeekS(@MODULEENTRY32\szExePath))+" | Path: "+PeekS(@MODULEENTRY32\szExePath)
        AddGadgetItem (0, -1, title+Chr(10)+class+Chr(10)+Str(hwnd)+Chr(10)+GetFilePart(PeekS(@MODULEENTRY32\szExePath))+Chr(10)+PeekS(@MODULEENTRY32\szExePath))
        Define a
      EndIf
      CloseHandle_(Snapshot)
    EndIf
  EndIf
  ProcedureReturn #True
EndProcedure

Procedure.I GetSelectedColumn(ListIconID.I)
  Protected CursorLocation.POINT
  Protected HitInfo.LVHITTESTINFO
  GetCursorPos_(CursorLocation)
  MapWindowPoints_(0, GadgetID(ListIconID), CursorLocation, 1)             
  Hitinfo\pt\x = CursorLocation\x
  HitInfo\pt\y = CursorLocation\y
  SendMessage_(GadgetID(ListIconID), #LVM_SUBITEMHITTEST, 0, HitInfo)
  ProcedureReturn HitInfo\iSubItem
EndProcedure

;' changes by AHa 
Procedure OnEvent_SizeWindow() 
  Protected WndW, WndH
  WndW = WindowWidth(0) 
  WndH = WindowHeight(0) 
  ResizeGadget(0, #PB_Ignore, #PB_Ignore, WndW-10, WndH-60) 
  ResizeGadget(1, #PB_Ignore, #PB_Ignore, WndW-10, #PB_Ignore) 
  ResizeGadget(2, WndW/2-50, WndH-25, #PB_Ignore, #PB_Ignore)  
EndProcedure
;' End of changes 


If OpenWindow(0, 0, 0, 1010, 250, "Process Info:", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
  ; WindowBounds(0, 1010, 200, #PB_Ignore, #PB_Ignore)
  TextGadget(1, 5, 5, 1000, 20, "RightClick to copy cell content to clipboard", #PB_Text_Center)
  ListIconGadget(0, 5, 30, 1000, 190, "Title", 200, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_GridLines)
  AddGadgetColumn(0, 1, "Class", 240)
  AddGadgetColumn(0, 2, "Handle", 60)
  AddGadgetColumn(0, 3, "Program", 200)
  AddGadgetColumn(0, 4, "Path", 500)
  ButtonGadget(2, 455, 225, 100, 20, "Refresh")
  EnumChildWindows_(FindWindow_("ToolbarWindow32",0),@ListWindows(),0)
  ;SetGadgetState(0, 0)

;' changes by AHa 
;' With WindowFlag == #PB_Window_SizeGadget a EventHandler on Size is needed IMHO 
  BindEvent(#PB_Event_SizeWindow, @OnEvent_SizeWindow())
;' End of changes 
 
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
      Case #PB_Event_Gadget
        If EventGadget() = 0 And EventType() = #PB_EventType_RightClick
          Debug GetGadgetItemText(0, -1, GetSelectedColumn(0)) + ": " + GetGadgetItemText(0, GetGadgetState(0), GetSelectedColumn(0))
          SetClipboardText(GetGadgetItemText(0, GetGadgetState(0), GetSelectedColumn(0)))
          MessageRequester("Information", "Copied " + GetGadgetItemText(0, -1, GetSelectedColumn(0)) + ": " + Chr(13) + Chr(13) + GetGadgetItemText(0, GetGadgetState(0), GetSelectedColumn(0)) + Chr(13) + Chr(13) + "to clipboard!")
        EndIf
        If EventGadget() = 2 And EventType() = #PB_EventType_LeftClick
;' changes by AHa 
;'        RunProgram(ProgramFilename())
;'        End
          ClearGadgetItems(0) 
          EnumChildWindows_(FindWindow_("ToolbarWindow32",0), @ListWindows(), 0) 
;' End of changes 
        EndIf
    EndSelect
  ForEver
 
EndIf 

Re: App Liste mit Infos

Verfasst: 14.02.2021 22:08
von Zerosurf
WOW!!! Das wertet das Ganze natürlich auf - vielen, vielen Dank!

:D :allright: