Page 1 sur 1

Savoir si le programme est deja executer.

Publié : mar. 12/juil./2011 17:37
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

Re: Savoir si le programme est deja executer.

Publié : mar. 12/juil./2011 17:57
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.

Re: Savoir si le programme est deja executer.

Publié : mar. 12/juil./2011 18:16
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)

Re: Savoir si le programme est deja executer.

Publié : mar. 12/juil./2011 18:33
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

Re: Savoir si le programme est deja executer.

Publié : mar. 12/juil./2011 19:12
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.

Re: Savoir si le programme est deja executer.

Publié : mar. 12/juil./2011 19:26
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.