App Liste mit Infos

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Zerosurf
Beiträge: 131
Registriert: 11.10.2005 15:46

App Liste mit Infos

Beitrag 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

PureBasic 6.00 | Windows 10 pro (x64)
Benutzeravatar
dige
Beiträge: 1182
Registriert: 08.09.2004 08:53

Re: App Liste mit Infos

Beitrag von dige »

Danke für das Beispiel. Damit alle Prozesse angezeigt werden, muss es mit x64 compiliert werden.
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."
Benutzeravatar
Zerosurf
Beiträge: 131
Registriert: 11.10.2005 15:46

Re: App Liste mit Infos

Beitrag 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!
PureBasic 6.00 | Windows 10 pro (x64)
Axolotl
Beiträge: 146
Registriert: 31.12.2008 16:34

Re: App Liste mit Infos

Beitrag 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 
Mostly running PureBasic <latest stable version and current alpha/beta> (x64) on Windows 11 Home
Benutzeravatar
Zerosurf
Beiträge: 131
Registriert: 11.10.2005 15:46

Re: App Liste mit Infos

Beitrag von Zerosurf »

WOW!!! Das wertet das Ganze natürlich auf - vielen, vielen Dank!

:D :allright:
PureBasic 6.00 | Windows 10 pro (x64)
Antworten