Lanceur d'applications

Programmation d'applications complexes
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Lanceur d'applications

Message par Micoute »

Bonjour à tous,

aujourd'hui, je viens vous offrir un lanceur d'applications tout simple, il suffit de choisir des applications qui peuvent vous servir souvent, le programme les enregistre dans un fichier texte appelé apps.txt dans le même répertoire que le lanceur.

Quand vous relancez le lanceur, vous sélectionnez l'application à lancer et cliquez le bouton "Lancer".

Code : Tout sélectionner

Enumeration Fichiers
  #Fichier
EndEnumeration
Enumeration fenetres
  #Fenetre_principale
EndEnumeration
Enumeration Gadgets
  #Btn_Ajouter
  #Btn_Lancer
  #Btn_Quitter
  #Lst_Applis
EndEnumeration
Enumeration Polices
  #Police
EndEnumeration

LoadFont(#Police, "Arial Nova", 12, #PB_Font_Bold)
SetGadgetFont(#PB_Default, FontID(#Police))

Procedure.s Extraire_Nom_de_Fichier(chemin$)
  ; Trouver la dernière barre oblique inversée pour isoler le nom du fichier
  position = FindString(chemin$, "\", -1)
  If position > 0
    ProcedureReturn Mid(chemin$, position + 1)
  Else
    ProcedureReturn chemin$
  EndIf
EndProcedure


Procedure ChargerApplications()
  If FileSize("apps.txt") = -1
    CreateFile(#Fichier, "apps.txt")
    CloseFile(#Fichier)
  EndIf

  If ReadFile(#Fichier, "apps.txt")
    Debug "Lecture du fichier..."
    While Not Eof(#Fichier)
      chemin$ = ReadString(#Fichier)
      
      ; Vérifie si c'est une URL ou un fichier
      If FindString(chemin$, "http", 1) > 0
        nomAffiche$ = chemin$  ; Garde l'URL telle quelle
      Else
        nomAffiche$ = GetFilePart(chemin$)  ; Extrait uniquement le nom du fichier
      EndIf
      
      Debug "Ajout : " + nomAffiche$
      AddGadgetItem(#Lst_Applis, -1, nomAffiche$)
    Wend
    CloseFile(#Fichier)
  Else
    Debug "Impossible de lire le fichier apps.txt"
  EndIf
EndProcedure

Procedure AjouterApplication()
  application$ = OpenFileRequester("Sélectionner une application", "", "", 0)
  If application$ <> ""
    fileName$ = Extraire_Nom_de_Fichier(application$)  ; Extraire le nom du fichier

    ; Enregistrer le chemin complet dans le fichier
    If OpenFile(#Fichier, "apps.txt", #PB_File_Append)
      WriteStringN(0, application$)
      CloseFile(#Fichier)

      ; Ajouter uniquement le nom du fichier dans la liste
      AddGadgetItem(#Lst_Applis, -1, fileName$)
    Else
      MessageRequester("Erreur", "Impossible d'ouvrir le fichier apps.txt")
    EndIf
  EndIf
EndProcedure

Procedure LancerApplication()
  indexSeletionne = GetGadgetState(#Lst_Applis)
  If indexSeletionne >= 0
    ; Lire le fichier pour récupérer le chemin complet correspondant
    If ReadFile(#Fichier, "apps.txt")
      i = 0
      While Not Eof(#Fichier)
        chemin$ = ReadString(#Fichier)
        If i = indexSeletionne
          RunProgram(chemin$)
          CloseFile(#Fichier)
          ProcedureReturn
        EndIf
        i + 1
      Wend
      CloseFile(#Fichier)
    EndIf
  Else
    MessageRequester("Erreur", "Aucune application sélectionnée !")
  EndIf
EndProcedure

OpenWindow(#Fenetre_principale, 1910, 0, 340, 300, "Lanceur d'Applications", #PB_Window_BorderLess)
ListViewGadget(#Lst_Applis, 10, 10, 320, 240)
ButtonGadget(#Btn_Ajouter, 10, 260, 100, 30, "Ajouter")
ButtonGadget(#Btn_Lancer, 120, 260, 100, 30, "Lancer")
ButtonGadget(#Btn_Quitter, 230, 260, 100, 30, "Quitter")

SetWindowColor(#Fenetre_principale, $F63035)
SetGadgetColor(#Lst_Applis, #PB_Gadget_BackColor, $F63035)
SetGadgetColor(#Lst_Applis, #PB_Gadget_FrontColor, $FFFFFF)

ChargerApplications()

Repeat
  Evenement = WaitWindowEvent()
  If Evenement = #PB_Event_Gadget
    Select EventGadget()
      Case #Btn_Ajouter
        AjouterApplication()
      Case #Btn_Lancer
        LancerApplication()
      Case #Btn_Quitter
        End
    EndSelect
  EndIf
Until Evenement = #PB_Event_CloseWindow
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Lanceur d'applications

Message par SPH »

[14 :46 :09] Attente du démarrage du programme...
[14 :46 :09] Type d'exécutable: Windows - x64 (64bit, Unicode)
[14 :46 :09] Exécutable démarré.
[14 :46 :09] [ERREUR] Ligne: 34
[14 :46 :09] [ERREUR] Le #File spécifié n'est pas initialisé.
[14 :46 :15] Le programme a été arrêté.
Désolé :?

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Lanceur d'applications

Message par falsam »

@SPH : Enregistre le cde dans un dossier.

@MIcoute : A part une fenêtre de debug, je ne vois rien d'autres. Ton exécutable est visible uniquement dans la barre des taches.
Micoute a écrit : mar. 10/juin/2025 13:38 il suffit de choisir des applications qui peuvent vous servir souvent, le programme les enregistre dans un fichier texte appelé apps.txt
C'est ce que j'ai fait ! Le fichier apps.txt est vide.

Question : Comment choisir une ou plusieurs applications ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Mouillard
Messages : 79
Inscription : mer. 13/sept./2017 14:35
Localisation : Picardie (Somme)

Re: Lanceur d'applications

Message par Mouillard »

Merci Micoute, très utile, marche très bien chez moi, PB 6.00 LTS 8)
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Lanceur d'applications

Message par Jacobus »

Salut Micoute,
Ton idée est sympa mais code incomplet. Je te donne quelques suggestions pour que ce soit plus fonctionnel.
J'ai apporté des modifs à ton code : (testé avec PB 6.21 x86 sur Windows 10)
Les points conseils :
- Positionnement de la fenêtre, invisible sur les écrans de moins de 1910 de large.
- Offrir l'option de positionnement à l'utilisateur
- Ajouter la possibilité de mettre des dossiers dans le lanceur
- Ajouter la possibilité de minimiser la fenêtre et de la réafficher (depuis la zone de notification peut-être)
- Attention de ne pas fermer 2 fois un fichier, cela pourrait planter puisque plus initialisé...
Bonne journée :wink:

Code : Tout sélectionner

Enumeration Fichiers
  #Fichier
EndEnumeration
Enumeration fenetres
  #Fenetre_principale
EndEnumeration
Enumeration Gadgets
  #Btn_Ajouter
  #Btn_Lancer
  #Btn_Quitter
  #Lst_Applis
EndEnumeration
Enumeration Polices
  #Police
EndEnumeration

LoadFont(#Police, "Arial Nova", 12, #PB_Font_Bold)
SetGadgetFont(#PB_Default, FontID(#Police))

;**************
;-Inutile, il y a GetFilePart() pour ça
;**************
; Procedure.s Extraire_Nom_de_Fichier(chemin$)
;   ; Trouver la dernière barre oblique inversée pour isoler le nom du fichier
;   position = FindString(chemin$, "\", -1)
;   If position > 0
;     ProcedureReturn Mid(chemin$, position + 1)
;   Else
;     ProcedureReturn chemin$
;   EndIf
; EndProcedure


Procedure ChargerApplications()
  
  If FileSize("apps.txt") = -1
    CreateFile(#Fichier, "apps.txt")
    CloseFile(#Fichier)
  EndIf

  If ReadFile(#Fichier, "apps.txt")
    Debug "Lecture du fichier..."
    While Not Eof(#Fichier)
      chemin$ = ReadString(#Fichier)
      
      ; Vérifie si c'est une URL ou un fichier
      If FindString(chemin$, "http", 1) > 0
        nomAffiche$ = chemin$  ; Garde l'URL telle quelle
      Else
        nomAffiche$ = GetFilePart(chemin$)  ; Extrait uniquement le nom du fichier
      EndIf
      
      Debug "Ajout : " + nomAffiche$
      AddGadgetItem(#Lst_Applis, -1, nomAffiche$)
    Wend
    Debug "Fichier clos"
    CloseFile(#Fichier)
  Else
    Debug "Impossible de lire le fichier apps.txt"
  EndIf
  
EndProcedure

Procedure AjouterApplication()
  application$ = OpenFileRequester("Sélectionner une application", "", "", 0)
  If application$ <> ""
    
    ;fileName$ = Extraire_Nom_de_Fichier(application$)  ; Extraire le nom du fichier
    fileName$ = GetFilePart(application$) ; cette fonction le fait déjà

    ; Enregistrer le chemin complet dans le fichier
    If OpenFile(#Fichier, "apps.txt", #PB_File_Append)
      WriteStringN(0, application$) ; ajout du chemin complet dans le fichier
      CloseFile(#Fichier)

      ; Ajouter uniquement le nom du fichier dans la liste
      AddGadgetItem(#Lst_Applis, -1, fileName$)
    Else
      MessageRequester("Erreur", "Impossible d'ouvrir le fichier apps.txt")
    EndIf
  EndIf
EndProcedure

Procedure LancerApplication()
  indexSeletionne = GetGadgetState(#Lst_Applis)
  If indexSeletionne >= 0
    ; Lire le fichier pour récupérer le chemin complet correspondant
    If ReadFile(#Fichier, "apps.txt")
      i = 0
      While Not Eof(#Fichier)
        ;ici on récupère le nom du fichier dans la Listview
        File$ = GetGadgetItemText(#Lst_Applis,indexSeletionne)
        ;le chemin complet dans le fichier
        chemin$ = ReadString(#Fichier)
        ;on cherche le nom du fichier à lancer dans les chaines de chemins complets du fichier texte
        If FindString(chemin$, File$) > 0
          ;si on le trouve on le démarre
          If i = indexSeletionne
            RunProgram(chemin$)
           ; CloseFile(#Fichier)
           ; ProcedureReturn
          EndIf
          
        EndIf 
        i + 1
      Wend
      
      CloseFile(#Fichier)
    EndIf
  Else
    MessageRequester("Erreur", "Aucune application sélectionnée !")
  EndIf
EndProcedure

;Modification de la position de la fenêtre pour qu'elle soit visible
;Tu devrais ajouter ensuite seulement l'option du positionnement
OpenWindow(#Fenetre_principale, 0, 0, 340, 300, "Lanceur d'Applications", #PB_Window_ScreenCentered|#PB_Window_BorderLess)
ListViewGadget(#Lst_Applis, 10, 10, 320, 240)
ButtonGadget(#Btn_Ajouter, 10, 260, 100, 30, "Ajouter")
ButtonGadget(#Btn_Lancer, 120, 260, 100, 30, "Lancer")
ButtonGadget(#Btn_Quitter, 230, 260, 100, 30, "Quitter")

SetWindowColor(#Fenetre_principale, $F63035)
SetGadgetColor(#Lst_Applis, #PB_Gadget_BackColor, $F63035)
SetGadgetColor(#Lst_Applis, #PB_Gadget_FrontColor, $FFFFFF)

ChargerApplications()

Repeat
  Evenement = WaitWindowEvent()
  If Evenement = #PB_Event_Gadget
    Select EventGadget()
      Case #Btn_Ajouter
        AjouterApplication()
      Case #Btn_Lancer
        LancerApplication()
      Case #Btn_Quitter
        End
    EndSelect
  EndIf
Until Evenement = #PB_Event_CloseWindow
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Lanceur d'applications

Message par Micoute »

J'oublie toujours que tout le monde n'a pas une résolution de 2560x1080, veuillez m'en excuser.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
pasbel
Messages : 38
Inscription : mer. 10/avr./2019 17:36

Re: Lanceur d'applications

Message par pasbel »

Salut
Ça fonctionne bien.

Tu devrais y ajouter un système de "catégories".
Par exemple :
On choisit la catégorie "PureBasic", la fenêtre affiche tout ce qu'on a entré concernant PureBasic, le logiciel, les liens vers le forum, les références en ligne,... des raccourcis vers des dossiers et fichiers (PDF de référence pat exemple, ou fichiers Help) locaux.
Autres catégorie "Outils" qui affiche les programme utiles genre Bloc note, Calculatrice, Paint, des programmes de nettoyage Win ou d'autres trucs.

Un affichage par icônes optionnel serait sympa aussi (en remontant l'icône du programme ou type de fichier).
Et une fenêtre redimensionnable.

Je te donne beaucoup de travail ;-)
Répondre