Savoir si le programme est deja executer.

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Savoir si le programme est deja executer.

Message par GallyHC »

Bonjour tout le monde,

J'ai fait un petit code pour savoir si le programme est déjà executer. Si cela est le cas il met la fenêtre tu programme actif et quitte automatiquement.

Code : Tout sélectionner

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

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

EnableExplicit

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

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

#SW_SHOWNORMAL = 1

Procedure.b ActivatePrevInstance(title.s)
; Recherhce du nom de la fenêtre.
  Protected hwnd

  hwnd = FindWindow_(#Null, title)
  If hwnd
    
    ;
    ; A RETIRE JUSTE POUR LE TEST
    ;
    MessageRequester("ActivatePrevInstance", "Une précédente Instance portant le même nom a été trouvée. Nous allons la rappeler à l'écran et quitter.", #PB_MessageRequester_Ok)
    ;
    ; A RETIRE JUSTE POUR LE TEST
    ;
    
    ShowWindow_(hwnd, #SW_SHOWNORMAL)
    SetForegroundWindow_(hwnd)
    End
  EndIf
  ProcedureReturn #False

 EndProcedure   
    
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Define hWnd.l
Define event.l
Define title.s = "Nom de la Fenêtre..."

If ActivatePrevInstance(title) = #False
  hWnd = OpenWindow(0, 0, 0, 200, 100, title, #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
  If hWnd <> 0
    Repeat
      event = WaitWindowEvent()
    Until event = #PB_Event_CloseWindow
  EndIf
EndIf
Creer un executable et lancer le plusieur fois pour voir le resultat. J'espère que cela vous sera utile?

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Savoir si le programme est deja executer.

Message par Ar-S »

Autre solution :

Code : Tout sélectionner

Procedure OneInstance(TitreDeLaFenetre$)
  WindowTitle.s=TitreDeLaFenetre$
  SetLastError_(#NO_ERROR)
  hMutex.l= CreateMutex_(#Null, #False, @WindowTitle)
  Erreur.l = GetLastError_()
  If ( Erreur = #ERROR_ALREADY_EXISTS ) Or ( Erreur = #ERROR_ACCESS_DENIED )
    ; SetWindowState(fenetre,#PB_Window_Minimize)
    ; MessageRequester("Alerte","Le programme est déjà ouvert",#MB_ICONEXCLAMATION)
    End
  EndIf
EndProcedure
Dé-commentez les 2 lignes ";" si vous voulez faire apparaitre un message.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Savoir si le programme est deja executer.

Message par nico »

La seule solution viable est celle de ARs que j'utilise déjà depuis plusieurs années, trouvé sur le site de microsoft.

D'ailleurs, il manque un closehandle_(hmutex)
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Savoir si le programme est deja executer.

Message par GallyHC »

Il n'y a jamais une seule solution a un problème, enfin je ne penses pas et surtout en programmation. Bon par contre j'ai repris celle de Ar-s et apporter quelque modification (Rend la fenêtre visible et l'affiche a l'écran).

Code : Tout sélectionner

#SW_SHOWNORMAL = 1

Procedure.b ActivatePrevInstance(title.s)
;
  Protected hwnd.l
  Protected hMutex.l
  Protected Erreur.l

  SetLastError_(#NO_ERROR)
  hMutex.l = CreateMutex_(#Null, #False, @title)
  Erreur.l = GetLastError_()
  If ( Erreur = #ERROR_ALREADY_EXISTS ) Or ( Erreur = #ERROR_ACCESS_DENIED )
    CloseHandle_(hmutex)
    hwnd = FindWindow_(#Null, title)
    If hwnd
      ShowWindow_(hwnd, #SW_SHOWNORMAL)
      SetForegroundWindow_(hwnd)
    EndIf
    End
  EndIf
  
EndProcedure
cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Savoir si le programme est deja executer.

Message par graph100 »

perso, mes programmes ont souvent des infos dans le titre de la fenetre, et plusieurs fenetres ouvertes.
Donc je ne trouve pas cette solution viable.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Savoir si le programme est deja executer.

Message par nico »

Oui, il y a plusieurs façon, d'ailleurs findwindow était la méthode que tout le monde utilisait avant de découvrir la méthode par mutex qui à déjà 4 ans ici et plus sur le forum anglais.

Il faudrait passer en paramètre le nom du prog (+ quelquechose) qui lui est censé être unique plutot que le titre de la fenetre parce que c'est justement l'avantage du mutex par rapport à findwindow entre autres.
Répondre