Page 1 sur 1

comment créer une icône sur le bureau pour lancer un prog

Publié : jeu. 24/janv./2019 8:46
par Micoute
Bonjour à tous,

Je reviens à nouveau vers vous pour solliciter votre aide bienveillante.

Mon problème découle de l'aide que vous m'avez déjà apportée pour l'installation de programmes à partir d'une clé USB, et donc maintenant quand l'installation est terminée, je souhaiterais avoir une icône sur le bureau ou dans la barre des tâches pour pouvoir exécuter le programme nouvellement installé .

Cette fois-ci, je n'ai pas de code, car je n'ai pas la moindre idée de comment pratiquer.

Je vous remercie tous à l'avance pour les réponses que vous allez me donner.

Re: comment créer une icône sur le bureau pour lancer un pr

Publié : jeu. 24/janv./2019 9:14
par Mesa
J'ai trouvé ça dans mes archives mais je ne sais pas si ça marche sous Windows 10, ça devrait je pense.

Code : Tout sélectionner

;PB4.00
;20061127, now works with unicode executables

EnableExplicit

Declare createShellLink(obj.s, lnk.s, arg.s, desc.s, dir.s, icon.s, index)
Declare.s getSpecialFolder(id)

Procedure.s getSpecialFolder(id)
  Protected path.s, *ItemId.ITEMIDLIST
  
  *itemId = #Null
  If SHGetSpecialFolderLocation_(0, id, @*ItemId) = #NOERROR
    path = Space(#MAX_PATH)
    If SHGetPathFromIDList_(*itemId, @path)
      If Right(path, 1) <> "\"
        path + "\"
      EndIf
      ProcedureReturn path
    EndIf
  EndIf
  ProcedureReturn ""
EndProcedure

Procedure createShellLink(obj.s, lnk.s, arg.s, desc.s, dir.s, icon.s, index)
  ;obj - path to the exe that is linked to, lnk - link name, dir - working
  ;directory, icon - path to the icon file, index - icon index in iconfile
  Protected hRes.l, mem.s, ppf.IPersistFile
  CompilerIf #PB_Compiler_Unicode
    Protected psl.IShellLinkW
  CompilerElse
    Protected psl.IShellLinkA
  CompilerEndIf
  
  ;make shure COM is active
  CoInitialize_(0)
  hRes = CoCreateInstance_(?CLSID_ShellLink, 0, 1, ?IID_IShellLink, @psl)
  
  If hRes = 0
    psl\SetPath(Obj)
    psl\SetArguments(arg)
    psl\SetDescription(desc)
    psl\SetWorkingDirectory(dir)
    psl\SetIconLocation(icon, index)
    ;query IShellLink for the IPersistFile interface for saving the
    ;link in persistent storage
    hRes = psl\QueryInterface(?IID_IPersistFile, @ppf)
    
    If hRes = 0
      ;CompilerIf #PB_Compiler_Unicode
      ;save the link
      hRes = ppf\Save(lnk, #True)
      ;       CompilerElse
      ;         ;ensure that the string is ansi unicode
      ;         mem = Space(#MAX_PATH)
      ;         MultiByteToWideChar_(#CP_ACP, 0, lnk, -1, mem, #MAX_PATH)
      ;         ;save the link
      ;         hRes = ppf\Save(mem, #True)
      ;       CompilerEndIf
      ppf\Release()
    EndIf
    psl\Release()
  EndIf
  
  ;shut down COM
  CoUninitialize_()
  
  DataSection
    CLSID_ShellLink:
    Data.l $00021401
    Data.w $0000,$0000
    Data.b $C0,$00,$00,$00,$00,$00,$00,$46
    IID_IShellLink:
    CompilerIf #PB_Compiler_Unicode
      Data.l $000214F9
    CompilerElse
      Data.l $000214EE
    CompilerEndIf
    Data.w $0000,$0000
    Data.b $C0,$00,$00,$00,$00,$00,$00,$46
    IID_IPersistFile:
    Data.l $0000010b
    Data.w $0000,$0000
    Data.b $C0,$00,$00,$00,$00,$00,$00,$46
  EndDataSection
  ProcedureReturn hRes
EndProcedure

#CSIDL_WINDOWS = $24
#CSIDL_DESKTOPDIRECTORY = $10

Global obj.s, lnk.s

obj = getSpecialFolder(#CSIDL_WINDOWS) + "Notepad.exe"
lnk = getSpecialFolder(#CSIDL_DESKTOPDIRECTORY) + "Demo link.lnk"

If createShellLink(obj, lnk, "", "Open Notepad", "C:\", obj, 0) = 0
  MessageRequester("OK", "Raccourci créé sur le bureau", #PB_MessageRequester_Ok)
EndIf
End
M.

Re: comment créer une icône sur le bureau pour lancer un pr

Publié : jeu. 24/janv./2019 9:25
par Ar-S
Marc56 t'a donné le code dans ton propre topic "Comment copier un fichier d'un lecteur à un autre".. :roll:

Re: comment créer une icône sur le bureau pour lancer un pr

Publié : jeu. 24/janv./2019 9:42
par Marc56
Oui
https://www.purebasic.fr/french/viewtop ... 24#p202724
C'est un peu trompeur quand on ne le sait pas, car "Lien symbolique" est un terme Unix (ln -s) que Ms a repris pour redéfinir son terme 'raccourci' :wink:

Code : Tout sélectionner

C:\>mklink /?
Crée un lien symbolique.

MKLINK [[/D] | [/H] | [/J]] Lien Cible

        /D      Crée un lien symbolique vers un répertoire. Par défaut,
                il s'agit d'un lien symbolique vers un fichier.
        /H      Crée un lien physique à la place d'un lien symbolique.
        /J      Crée une jonction de répertoires.
        Lien    Spécifie le nom du nouveau lien symbolique.
        Cible   Spécifie le chemin d'accès (relatif ou absolu) auquel
                le nouveau lien fait référence.
Note: Je viens de vérifier, la commande mklink est disponible à partir de Windows Vista, donc dans ton cas Micoute, tu seras peut-être obligé d'utiliser la méthode API si tu as quelques utilisateurs XP.

Re: comment créer une icône sur le bureau pour lancer un pr

Publié : jeu. 24/janv./2019 11:02
par Micoute
Mille excuses, je n'avais même pas vu ce programme qui apparemment ne fonctionne pas avec Windows 10, mais comme je suis une brêle, peut-être que je ne comprends pas le fonctionnement.

Re: comment créer une icône sur le bureau pour lancer un pr

Publié : jeu. 24/janv./2019 11:08
par Micoute
Voici l'essai que j'ai compilé sur ma clé, mais je n'ai pas de nouvelle icône sur l'écran.

Code : Tout sélectionner

EnableExplicit

Define Program_Title$   = "Diabdepiste"
Define Program_EXE$     = "Diabdepiste.exe"
Define Program_Rep$     = "D:\AFD50"

SetCurrentDirectory(GetUserDirectory(#PB_Directory_Desktop))

RunProgram("cmd", "/c mklink "      +
                  #DQUOTE$          +
                  Program_Title$    +
                  #DQUOTE$          +
                  " "               +
                  #DQUOTE$          +
                  Program_Rep$      + 
                  "\"               + 
                  Program_EXE$      +
                  #DQUOTE$,
           "")

End

Re: comment créer une icône sur le bureau pour lancer un pr

Publié : jeu. 24/janv./2019 17:10
par Marc56
Faute de frappe: Tu as écris dans ton dernier code: "Diabdepiste.exe"
alors qu'avant ton programme s’appelait: "Diagdepiste.exe"

(j'ai mis du temps à trouver)
:wink:

Pour ne pas avoir ce type d'erreur en cours de programme, il est intéressant d'ajouter une vérification (exemple au début du programme vérifier que l'EXE est là)

Code : Tout sélectionner

If FileSize(Program_Rep$ + "\" + Program_EXE$) <> -1
    MessageRequester("Erreur: Le Fichier Source n'existe pas",
                     Program_Rep$ + "\" + Program_EXE$, #PB_MessageRequester_Error)
    End
EndIf
PS. mklink est arrivé à partir de Windows Vista, donc il marche pour Vista, Seven, 8, 8.1, 10

Re: comment créer une icône sur le bureau pour lancer un pr

Publié : ven. 25/janv./2019 8:26
par Micoute
Bonjour à tous,

@Merc56, d'abord, merci beaucoup pour l'aide providentielle que tu me donnes et ça me fait bien avancer, non ce n'est pas une faute de frappe, car le programme se nomme "Diabdepiste" qui est une contraction de "Diabète dépiste" et c'est moi dans ma confusion qui a induit tout le monde en erreur et je demande qu'on m'en excuse.

Les sécurités que tu apportes en vérifiant la présence des fichiers qui seront utilisés sont de bonnes précautions à mon humble avis, car ça peut éviter de chercher le petit graine de sable dans la machine.

Re: comment créer une icône sur le bureau pour lancer un pr

Publié : ven. 25/janv./2019 14:50
par pierre003
Je ne suis pas spécialiste dans PB mais j’ai crée un programme il y a quelques temps et j’ai mis une icône il faudrait que je retrouve, mais je n’ai pas eu trop de problèmes le fichier est un peu plus lourd mais ça marche sans s’occuper si le fichier icône est là.
Dans Compilateur/Option du compilateur/Utiliser une icône et on sélectionne l’icône, si je me rappelle (l’icône est dans le programme pour quelques ko de plus)
Et en copiant le raccourci sur le bureau c'est ok.
Bon WE a tous
Pierre

Re: comment créer une icône sur le bureau pour lancer un pr

Publié : sam. 26/janv./2019 23:48
par omega
Voici un code qui marche très bien et que j'utilise très souvent dans mes programmes d'installation. Je ne me rappelle pas de l'auteur mais il m'a été fourni par Falsam. Pour que le programme fonctionne, il faut créer un nouveau dossier appelé par exemple TestIcone, dans ce dossier mettre un programme exécutable (il doit apparaitre avec une icône bien entendu), mettre enfin ce code dans le même dossier puis excuter-le:

Code : Tout sélectionner

#CSIDL_DESKTOPDIRECTORY = $10 
#CSIDL_WINDOWS = $24 
#CSIDL_SYSTEM = $25 
#CSIDL_PROGRAM_FILES = $26 
#CSIDL_SYSTEMX86 = $29 
#CSIDL_PROGRAM_FILESX86 = $2A 
#CSIDL_PROGRAM_FILES_COMMON = $2B 
#CSIDL_PROGRAM_FILES_COMMONX86 = $2C 
 
Structure EMID 
    cb.b 
    abID.b[1] 
EndStructure 

Enumeration
#Win
#CreateIcone
EndEnumeration

Global Application.s, LinkFileName.s, LinkName.s, WorkDirectory.s, Exit
Declare createShellLink(Application.s, LinkFileName.s, arg.s, desc.s, dir.s, icon.s, index)

ProgName$="LinkIcone" ; nom du programme exemple: LinkIcone.exe liée à une icône, il se trouve dans le même dossier que ce programme (dossier courant). N'oubliez pas de le remplacer par le votre.   

Procedure createShellLink(Application.s, LinkFileName.s, arg.s, desc.s, dir.s, icon.s, index)
  Protected hRes.l, mem.s, ppf.IPersistFile
  CompilerIf #PB_Compiler_Unicode
    Protected psl.IShellLinkW
  CompilerElse
    Protected psl.IShellLinkA
  CompilerEndIf
  
  CoInitialize_(0)
  hRes = CoCreateInstance_(?CLSID_ShellLink, 0, 1, ?IID_IShellLink, @psl)
  
  If hRes = 0
    psl\SetPath(Application)
    psl\SetArguments(arg)
    psl\SetDescription(desc)
    psl\SetWorkingDirectory(dir)
    psl\SetIconLocation(icon, index)
    
    ;query IShellLink for the IPersistFile interface for saving the
    ;link in persistent storage
    hRes = psl\QueryInterface(?IID_IPersistFile, @ppf)
    
    If hRes = 0
      ;CompilerIf #PB_Compiler_Unicode
      ;save the link
      hRes = ppf\Save(LinkFileName, #True)
      ppf\Release()
    EndIf
    psl\Release()
  EndIf
  
  ;shut down COM
  CoUninitialize_()
  
  DataSection
    CLSID_ShellLink:
    Data.l $00021401
    Data.w $0000,$0000
    Data.b $C0,$00,$00,$00,$00,$00,$00,$46
    IID_IShellLink:
    CompilerIf #PB_Compiler_Unicode
      Data.l $000214F9
    CompilerElse
      Data.l $000214EE
    CompilerEndIf
    Data.w $0000,$0000
    Data.b $C0,$00,$00,$00,$00,$00,$00,$46
    IID_IPersistFile:
    Data.l $0000010b
    Data.w $0000,$0000
    Data.b $C0,$00,$00,$00,$00,$00,$00,$46
  EndDataSection
  ProcedureReturn hRes
EndProcedure

;-----------------------------------------------------------------------------
Procedure CreateIcone()
If createShellLink(Application, LinkFileName, "", LinkName, WorkDirectory, Application, 0) = 0
  errorfound=0
Else
  MessageRequester("Erreur","Le raccourci n'a pas pu être créé")
EndIf  
EndProcedure

;-----------------------------------------------------------------------------
OpenWindow(#Win, 0, 0, 500,120, "Créer raccourci sur le bureau", #PB_Window_ScreenCentered|#PB_Window_SystemMenu ) 
ButtonGadget(#CreateIcone,10, 30, 150, 30, "Créer icône sur le bureau")

exit=0

Repeat

EventID = WaitWindowEvent()
If EventID = #PB_Event_Gadget
   Select EventGadget()
   Case #CreateIcone
         Application = GetCurrentDirectory() + progname$+".exe"
         WorkDirectory = GetPathPart(Application)
         LinkFileName = GetHomeDirectory() + "desktop\" + progName$ +".lnk"
         LinkName =ProgDesc$
         CreateIcone()
         MessageRequester("Ok","Raccourci créé avec succès!")      
         Exit=1
   EndSelect
EndIf

If EventID=#PB_Event_CloseWindow
   Exit = 1
EndIf

Until Exit = 1
End

Re: comment créer une icône sur le bureau pour lancer un pr

Publié : dim. 27/janv./2019 7:55
par Micoute
Merci beaucoup omega pour le partage, mais je m'aperçois que c'est le même code à peu de choses près que celui de Mesa quelques postes plus haut, donc je vous remercie tous les deux sans oublier Marc56 qui m'a beaucoup aidé aussi.

Bon dimanche à tous.