Unser 'Täglich-Tool' gib uns heute

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Unser 'Täglich-Tool' gib uns heute

Beitrag von Kiffi »

Shalom,

wie wir alle wissen, eignet sich PureBasic wie kaum eine zweite Sprache
zum Erstellen von kleinen und schnellen Tools. Aus diesem Grund starte
ich hier mal -- inspiriert von 7x7 -- einen Thread,
in dem jeder seine mit PB geschriebenen und täglich genutzten Tools
vorstellen kann.

Macht mit! :allright:

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Unser 'Täglich-Tool' gib uns heute

Beitrag von Kiffi »

PureLauncher

Bild

PureLauncher ist ein kleines Tool, mit welchem man oft benötigte
Programme und Ordner schnell öffnen kann. Beim ersten Programmstart
legt PureLauncher unter

C:\Dokumente und Einstellungen\[benutzer]\Anwendungsdaten\

einen gleichnamigen Ordner an. Alle dort befindlichen Unterordner werden
im Programmfenster als Tab eines Panelgadgets angezeigt. Pro Tab wird
dann der jeweilige Ordnerinhalt aufgelistet.

Wenn man mit der Maus in die obere linke Ecke des Bildschirms fährt, wird
das PureLauncher-Fenster geöffnet. Mit rechtem Mausklick lässt sich die
Ordnerstruktur aktualisieren oder der aktuelle Ordner im Windows-Explorer
aufrufen. Ebenso kann man hiermit den PureLauncher beenden.

Code: Alles auswählen

EnableExplicit

Structure s_TabDir
  TabDir.s
  Fullpath.s
  ELG.l
EndStructure

Global NewList TabDir.s_TabDir()
Global HomeDir.s

Enumeration ; Windows
  #frmMain
EndEnumeration
Enumeration ; Gadgets
  #frmMain_PG
EndEnumeration
Enumeration ; Menues
  #Menu
  #Menu_Refresh
  #Menu_OpenFolder
  #Menu_Quit
EndEnumeration

Procedure.s GetSpecialFolderPath(CSIDL.l)
  ; by ts-soft
  Protected Path.s = Space(#MAX_PATH * SizeOf(Character))
  Protected Library = OpenLibrary(#PB_Any, "shell32.dll")
  If Library
    CompilerIf #PB_Compiler_Unicode
      CallFunctionFast(GetFunction(Library,"SHGetSpecialFolderPathW"), 0, @Path, CSIDL, 0)
    CompilerElse
      CallFunctionFast(GetFunction(Library,"SHGetSpecialFolderPathA"), 0, @Path, CSIDL, 0)
    CompilerEndIf
    CloseLibrary(Library)
  EndIf
  If Right(Path, 1) <> "\" : Path + "\" : EndIf
  ProcedureReturn Path
EndProcedure

Procedure SizeWindow()
  
  ResizeGadget(#frmMain_PG, #PB_Ignore, #PB_Ignore, WindowWidth(#frmMain) - 10, WindowHeight(#frmMain) - 10)
  ForEach TabDir()
    ResizeGadget(TabDir()\ELG, #PB_Ignore, #PB_Ignore, GetGadgetAttribute(#frmMain_PG, #PB_Panel_ItemWidth) - 10, GetGadgetAttribute(#frmMain_PG, #PB_Panel_ItemHeight) - 10)
  Next
  
EndProcedure

Procedure ReloadTabs()
  
  Protected ED.l
  Protected SelectedTab.s
  
  ClearList(TabDir())
  
  ED = ExamineDirectory(#PB_Any, HomeDir, "")
  If ED 
    While NextDirectoryEntry(ED)
      If DirectoryEntryType(ED) = #PB_DirectoryEntry_Directory
        If DirectoryEntryName(ED) <> "." And DirectoryEntryName(ED) <> ".."
          AddElement(TabDir())
          TabDir()\TabDir   = DirectoryEntryName(ED) 
          TabDir()\Fullpath = HomeDir + DirectoryEntryName(ED) + "\"
        EndIf
      EndIf
    Wend
    FinishDirectory(ED)
  EndIf
  
  If CountList(TabDir()) = 0
    AddElement(TabDir()) : TabDir()\TabDir = "Applications" : TabDir()\Fullpath = HomeDir + TabDir()\TabDir + "\" : CreateDirectory(TabDir()\Fullpath)
    AddElement(TabDir()) : TabDir()\TabDir = "Utilities"    : TabDir()\Fullpath = HomeDir + TabDir()\TabDir + "\" : CreateDirectory(TabDir()\Fullpath)
    AddElement(TabDir()) : TabDir()\TabDir = "Internet"     : TabDir()\Fullpath = HomeDir + TabDir()\TabDir + "\" : CreateDirectory(TabDir()\Fullpath)
    AddElement(TabDir()) : TabDir()\TabDir = "Games"        : TabDir()\Fullpath = HomeDir + TabDir()\TabDir + "\" : CreateDirectory(TabDir()\Fullpath)
  EndIf
  
  SortStructuredList(TabDir(), 0, OffsetOf(s_TabDir\TabDir), #PB_Sort_String)
  
  SelectedTab = GetGadgetItemText(#frmMain_PG, GetGadgetState(#frmMain_PG), 0)
  
  ClearGadgetItemList(#frmMain_PG)
  
  ForEach TabDir()
    
    AddGadgetItem(#frmMain_PG, -1, TabDir()\TabDir)
    
    TabDir()\ELG = ExplorerListGadget(#PB_Any, 5, 5, 200, 200, TabDir()\Fullpath, #PB_Explorer_NoParentFolder | #PB_Explorer_AutoSort)
    ChangeListIconGadgetDisplay(TabDir()\ELG, #PB_ListIcon_LargeIcon) 
    
    If SelectedTab = TabDir()\TabDir
      SetGadgetState(#frmMain_PG, ListIndex(TabDir()))
    EndIf
    
  Next
  
  SizeWindow()
  
EndProcedure

Procedure frmMain_Open()

  Protected WindowFlags.l
  
  WindowFlags | #PB_Window_ScreenCentered
  WindowFlags | #PB_Window_SystemMenu
  WindowFlags | #PB_Window_SizeGadget
  WindowFlags | #PB_Window_Invisible
  
  If OpenWindow(#frmMain, #PB_Ignore, #PB_Ignore, 600, 400, "PureLauncher " + Str(#jaPBe_ExecuteBuild), WindowFlags)
    If CreateGadgetList(WindowID(#frmMain))
      PanelGadget(#frmMain_PG, 5, 5, 290, 290)
      CloseGadgetList()
      CreatePopupMenu(#Menu)
      MenuItem(#Menu_Refresh, "Refresh")    
      MenuItem(#Menu_OpenFolder, "Open folder")    
      MenuBar()
      MenuItem(#Menu_Quit, "Quit")    
    EndIf
  EndIf
  
EndProcedure

Procedure ShowWindowX()
  HideWindow(#frmMain, #False)
  SetActiveWindow(#frmMain)
EndProcedure

Procedure HideWindowX()
  HideWindow(#frmMain, #True)
EndProcedure

Procedure Main()
  
  Protected WWE.l, Quit.l
  Protected LinkToExecute.s
  
  HomeDir = GetSpecialFolderPath(#CSIDL_APPDATA) + "purelauncher\"
  
  CreateDirectory(HomeDir)
  
  frmMain_Open()
  
  ReloadTabs()
  
  Repeat
    
    WWE=WaitWindowEvent(100)
    
    Select WWE
        
      Case #PB_Event_SizeWindow
        
        SizeWindow()
        
      Case #PB_Event_Menu
        
        Select EventMenu()
            
          Case #Menu_OpenFolder
            
            ForEach TabDir()
              
              If GetGadgetItemText(#frmMain_PG, GetGadgetState(#frmMain_PG), 0) = TabDir()\TabDir
                RunProgram(TabDir()\Fullpath)            
                HideWindowX()
                Break                
              EndIf
              
            Next
            
          Case #Menu_Quit
            Quit = #True
            
          Case #Menu_Refresh
            ReloadTabs()
            
        EndSelect
        
      Case #PB_Event_Gadget
        
        Select EventGadget()
            
          Case #frmMain_PG
            
          Default
            
            ForEach TabDir()
              
              If EventGadget() = TabDir()\ELG
                
                Select EventType()
                    
                  Case #PB_EventType_RightClick
                    
                    DisplayPopupMenu(#Menu,WindowID(#frmMain)) 
                    
                  Case #PB_EventType_LeftClick
                    
                    LinkToExecute = TabDir()\Fullpath + GetGadgetItemText(TabDir()\ELG, GetGadgetState(TabDir()\ELG), 0)
                    
                    ShellExecute_(#Null, #Null, LinkToExecute, #Null, #Null, #SW_SHOWNORMAL)
                    
                    HideWindowX()
                    
                EndSelect
                
                Break
                
              EndIf
              
            Next
            
        EndSelect
        
      Case #PB_Event_CloseWindow
        
        HideWindowX()
        
      Default
        
        If Not IsWindowVisible_(WindowID(#frmMain))
          
          If DesktopMouseX() < 4 And DesktopMouseY() < 4
            ShowWindowX()
          EndIf
          
        EndIf
        
    EndSelect
    
  Until Quit = #True
  
EndProcedure

Main()
a²+b²=mc²
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

meins habe ich ja schon mal in Tips/Tricks gepostet

Multi Copy&Past

Immer wieder habe ich (und andere vllt auch) das Problem das ich mehrere Zahlen, Wörter, Sätze oder ganze Abschnitte kopieren muss, ohne dauernt von den beiden Programmen hin und her zu springen.

Darum nutze ich dieses Tool dauerhaft am PC und lasse es im Hintergrund laufen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Meines hatte ich schon mal in "Anwendungen" vorgestellt, allerdings damals ohne Sourcecode.

Manche älteren und/oder kleineren Spiele sind nicht sehr flexibel im Hinblick auf ihre auflösung.
manche präsentieren sich stur in einem 640x480 Windowedscreen,
andere benutzen für ihren Fullscreen die Desktopauflösung,
und wieder andere bestehen schlichtweg drauf, dass der Desktop nur 256 farben haben soll.

Weil ich gerne mal ältere Games spiele, und keine Lust habe,
jedesmal manuell die Auflösung zu wechseln und nachher meine Icons wieder zu sortieren,
hab ich mir dieses kleine Tool gestrickt.

Hinweis:
nachdem man "Iconfy" gedrückt hat, hat man ein winziges Knöpfchen in der linken oberen Ecke,
das auch Sticky ist wenn diese Funktion aktiviert ist.
Damit kommt man von innerhalb eines Fullscreen-games wieder an den KGRS heran.
allerdings reagieren Fullscreen-Games unterschiedlich merkwürdig auf wechsel der Auflösung während der Laufzeit,
laut meiner erfahrung ist es besser, zuerst die Auflösung runterzusetzen, dann das game zu spielen,
und nach beendigen wieder die Auflösung zurückzusetzen.

Code: Alles auswählen

;*************************
;*** KGRS-TS
;*** 
;*** ResolutionSwitcher
;*** 
;*** Changes Desktop-Resolution
;*** without effekting the Icons
;*** 
;*** PB 4.02 - Win2K/XP
;*** Kaeru Gaman, 2007-03-23
;*** 
;*** thanks to DarkDragon for showing
;*** me the usage of this API-function
;*** thanks to ts-soft for
;*** additional improvement suggestions.
;*************************

EnableExplicit

Enumeration 
  #WinMain
  #WinIcon
EndEnumeration

Enumeration
  #FrameRes 
  #FrameCol
  #ContRes
  #ContCol
  #OptRes6
  #OptRes8
  #OptRes10
  #OptCol8
  #OptCol16
  #OptCol32
  #ButExe
  #ButRest
  #ButIco
  #ButStick
  #ButOpen
  #TextAbout
EndEnumeration

#Icon = 0

;*************************

Procedure Change_Desktop(Width.l, Height.l, Depth.l)
  Define dmScreenSettings.DEVMODE
  Define Check 
  dmScreenSettings\dmSize = SizeOf(dmScreenSettings)
  dmScreenSettings\dmPelsWidth = Width
  dmScreenSettings\dmPelsHeight = Height
  dmScreenSettings\dmBitsPerPel = Depth
  dmScreenSettings\dmFields = 262144 | 524288 | 1048576
  Check = ChangeDisplaySettings_(@dmScreenSettings, 4)
  If Check <> #DISP_CHANGE_SUCCESSFUL
    ChangeDisplaySettings_(0,0)
    MessageRequester("KGRS ERROR","Failed to Change Settings",#MB_ICONERROR)
  EndIf
EndProcedure


Define About$ = " ** KGRS ** "
About$ + "(c) by Kaeru Gaman, 2007-03-23 ** "
About$ + "Programmed in PureBASIC ** "
About$ + "www.PureBasic.com"

Define EvID.l 
Define GgID.l
Define EXIT.l   =   0
Define Width.l  = 800
Define Height.l = 600
Define Depth.l  =  16
Define Sticky.l =   1

;*************************

OpenWindow(#WinMain,0,0,200,152,"KGRS")

CreateGadgetList(WindowID(#WinMain))
  Frame3DGadget( #FrameRes,  4,  2, 92, 88, "Resolution")
  ContainerGadget(#ContRes,  8, 18, 84, 66)
    OptionGadget(#OptRes6 ,  4,  0, 80, 24,"640x480")
    OptionGadget(#OptRes8 ,  4, 22, 80, 24,"800x600")
    OptionGadget(#OptRes10,  4, 44, 80, 24,"1024x768")
  CloseGadgetList()
  Frame3DGadget( #FrameCol,104,  2, 92, 88, "Color Depth")
  ContainerGadget(#ContCol,108, 18, 84, 66)
    OptionGadget(#OptCol8 ,  4,  0, 80, 24,"256Col")
    OptionGadget(#OptCol16,  4, 22, 80, 24,"16bit")
    OptionGadget(#OptCol32,  4, 44, 80, 24,"32bit")
  CloseGadgetList()
  ButtonGadget(#ButExe  ,  4, 96, 92, 24,"Apply")
  ButtonGadget(#ButRest ,104, 96, 92, 24,"Restore")
  ButtonGadget(#ButIco  ,  4,124, 92, 24,"Iconfy")
  ButtonGadget(#ButStick,104,124, 92, 24,"Sticky",#PB_Button_Toggle)

OpenWindow(#WinIcon,0,0,5,5,"KGRS IconButton",#PB_Window_BorderLess)
  CreateGadgetList(WindowID(#WinIcon))
    ButtonGadget(#ButOpen,0,0,5,5,"")

;*************************

SetGadgetState(#OptRes8, 1)
SetGadgetState(#OptCol16, 1)

HideWindow(#WinIcon,1)

SetGadgetState(#ButStick, Sticky)
StickyWindow(#WinMain, Sticky)
StickyWindow(#WinIcon, Sticky)

;*************************

GadgetToolTip(#ButExe  , "Apply chosen Settings to active Desktop")
GadgetToolTip(#ButRest , "Restore your standard Desktop Settings")
GadgetToolTip(#ButIco  , "Shrink KGRS Window to IconButton")
GadgetToolTip(#ButStick, "Toggle Always-on-Top for KGRS Window and IconButton")
GadgetToolTip(#ButOpen , About$)

;**************************************************
Repeat
  EvID = WaitWindowEvent()
  GgID = EventGadget()
  Select EvID
    Case #PB_Event_Gadget
      Select GgID
;*************************
        Case #OptRes6
          Width = 640 : Height = 480
        Case #OptRes8
          Width = 800 : Height = 600
        Case #OptRes10
          Width = 1024 : Height = 768
;*************************
        Case #OptCol8
          Depth = 8
        Case #OptCol16
          Depth = 16
        Case #OptCol32
          Depth = 32
;*************************
        Case #ButExe
          Change_Desktop(Width, Height, Depth)
        Case #ButRest
          ChangeDisplaySettings_(0,0)
        Case #ButStick
          Sticky = GetGadgetState(#ButStick)
          StickyWindow(#WinMain, Sticky)
          StickyWindow(#WinIcon, Sticky)
        Case #ButIco
          HideWindow(#WinMain,1)
          HideWindow(#WinIcon,0)
        Case #ButOpen
          HideWindow(#WinMain,0)
          HideWindow(#WinIcon,1)
      EndSelect
    Case #PB_Event_CloseWindow
      EXIT = 1
  EndSelect
Until EXIT = 1
End
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

Code: Alles auswählen

OpenWindow(0,0,0,0,0,"", #PB_Window_Invisible)

Define mymouse.POINT
Define pid.l
Define hwnd.l
Define result.l

Repeat
  
  EventID = WaitWindowEvent(10)
  
  If getasynckeystate_(#VK_END)
    If getasynckeystate_(#VK_LBUTTON) < 0
        GetCursorPos_(@mymouse)
        hwnd = WindowFromPoint_(mymouse\x, mymouse\y)
        result = GetWindowThreadProcessId_(hwnd,@pid)
        
        If pid
          KillPID(pid,0)
        EndIf
        
        Delay(500)
    EndIf
  EndIf
  
  If getasynckeystate_(#VK_CONTROL) And getasynckeystate_(#VK_END)
    End
  EndIf
  
Until EventID = #PB_Event_CloseWindow


Mein kleiner Beitrag. Benutze ich immer, wenn sich (zB Spiele oder verhunzte Programme) quer stellen.

ENDE + Links Klick = Fremdes Programm zwangsschließen
STRG + ENDE = Tool beenden

Klingt rabiat (ist es auch), aber tut einfach zuverlässig seinen Dienst. Läuft bei mir mit dem Systemstart, allerdings mit nem Icon in der Startleiste.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

ich denke mal bei mir wird das meistenutzte tool wohl finder sein. :D
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
bembulak
Beiträge: 228
Registriert: 13.12.2005 16:34
Wohnort: Österreich

Beitrag von bembulak »

Tja, da Grafiken zu meinem täglichen Leben gehören:

bWebColors
me hat geschrieben: bWebColors ist ein kleines Grafiktool, mit dem man aus einer Liste von 650 Farben den Namen und die Farbcodes (Integer, RGB und HEX) suchen kann.
Im Paket sind der Sourcecode sowie auch die Binaries für Windows und Linux enthalten.
Ich benutze es, um mir die Farben für Bilder, Webseiten oder Stimmungen (in Räumen,...) rauszusuchen.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

*spam*
....für die namen hab ich mal das colors.inc von POV für PB übersetzt...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Programie
Beiträge: 1280
Registriert: 06.08.2005 22:56
Computerausstattung: https://www.sysprofile.de/id160800
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von Programie »

Ich verwende täglich mein selbstgeproggtes Programm "PureBasic Tools". Mit dem kann man aus dem SysTray heraus PureBasic starten, den Quellcode-Ordner öffnen, den Projektordner öffnen, den Quellcode des aktuellen Projektes mit PureBasic öffnen, den PureBasic-Ordner öffnen, die verschiedenen Hilfedateien (PB-Hilfe und Externe Hilfen aus dem "Help"-Ordner) anzeigen und sogar eigene Einträge in das Menü einfügen (Z.B. "Firefox", "FileZilla" oder so).
Und was es noch kann: PureBasic-Quellcodes direkt aus dem Explorer kompilieren. :)

Hier nochmal der Link zur Projektseite: Klick :wink:
BildBildBildBild
HoDam
Beiträge: 82
Registriert: 19.11.2004 13:57
Wohnort: Köln, Cologne

Beitrag von HoDam »

ganz poppelig aber sehr nützlich um den ursprünglichen Dateiennamen von verschieden workstation zu verschieben und im Dateinamen einen Timestamp zu hinterlegen.
Mit Hilfe der INI-Datei kann es für jede Workstation individuell angepasst werden. Ausserdem brauche ich jetzt nur noch das Serververzeichnis nach vorhandenen Dateien abfragen um sie weiter zu verarbeiten und nicht mehr jede einzelen Workstation

Code: Alles auswählen

; Timestamp - 
; Dieses Programm verschiebt eine Datei zu einem Zielpfad und ergänzt den Dateinamen um einen Zeitstempel im Dateinamen
; Die Konfigurationsdatei muss TimeStamp.ini heissen und im selben Verzeichnis wie TimeStamp.exe stehen.
; Das Zeitstempelformat kann angepasst werden
; %yyyy (Jahreszahl 4stellig)
; %mm (Monat)
; %dd (Tag)
; %hh (Stunden)
; %ii (Minuten)
; %ss (Sekunden)
; Beispiel: -%yyyy%mm%dd-%hh%ii%ss
; dispense.dci wird DIBAC-20080402-175922.txt
; Fehler (fehlende Timestamp.ini oder Datei) werden nicht abgefangen. Die Zieldatei wird dann nicht erstellt
; Beispiel INI File ----------------------------------------------
;Setting]
;TimeStampFormat= -%yyyy%mm%dd-%hh%ii%ss
;
;FilePath=c:\Dispenser\
;FileName=dispense
;FileExtension=dci
;
;TargetPath=h:\Dosierauftrag\
;TargetFileName=DIBAC
;TargetFileExtension=txt

;-Hauptprogramm
OpenPreferences("TimeStamp.ini")
PreferenceGroup("Setting")
RenameFile(ReadPreferenceString("FilePath", "") + ReadPreferenceString("FileName", "") + "." + ReadPreferenceString("FileExtension", ""), ReadPreferenceString("TargetPath", ReadPreferenceString("FilePath", "")) + ReadPreferenceString("TargetName", ReadPreferenceString("FileName", "")) + FormatDate(ReadPreferenceString("TimeStampFormat", ""), Date()) + "." + ReadPreferenceString("TargetExtension", ReadPreferenceString("FileExtension", "")))
Ich schreibe relativ häufig solche kleinen Tools.
Sie dienen in erster Linie dazu , aus anderen Anwendungen Information zu holen um sie dann weiter zu verarbeiten. Es gibt sicherlich elegantere Lösungen . Aber diese hier sind ziemlich Idiotensicher, insbesondere dann, wenn von den Programmen häufig updates gefahren werden und dann intern wieder irgendwelche Funktionen, etc. verändert, angepasst werden.
[/code]
PB 4 Final
Antworten