Bonjour à tous
J'ai trouvé comment vérifier si une application tourne avant de la lancer...
J'aimerais plutôt que l'application se ferme d'elle-même si une autre instance tourne déjà.
Merci d'avance.
Bonjour à tous
J'ai trouvé comment vérifier si une application tourne avant de la lancer...
J'aimerais plutôt que l'application se ferme d'elle-même si une autre instance tourne déjà.
Merci d'avance.
Utilise des MUTEX comme dans la Comment n'instancier qu'une seule fois un programme ?
Un vieux code de 2002 (il peut être même plus vieux, c'est inspiré d'un exemple de Phidels) qui en plus met la fenêtre de la précédente instance au premier plan
Avec les Delphi gère différemment la MainForm cela peut ne pas fonctionner (MainFormOnTaskbar à False)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100 unit Unique_Instance; { dans la projet : Application.Initialize; Application.Title := 'Titre du Programme'; if not UniqueInstance(Application.Title) then Exit; Application.CreateForm(TMenuFrm, MenuFrm); Application.Run; } interface uses forms,windows,sysutils; type PFindWindowStruct = ^TFindWindowStruct; TFindWindowStruct = record Caption: string; ClassName: string; WindowHandle: THandle; end; function UniqueInstance(Nom: String): boolean; procedure GoMainApp(Nom: String); function FindAWindow(ACaption: string): THandle; function EnumWindowsProc(hWindow: hWnd;lParam : LongInt): Boolean; stdcall; implementation function UniqueInstance(Nom: String): boolean; begin CreateMutex(nil, False, PChar(Nom)); Result := GetLastError <> ERROR_ALREADY_EXISTS; if not Result then GoMainApp(Application.Title); end; procedure GoMainApp(Nom: String); var ActifHnd: THandle; begin ActifHnd:= FindAWindow(Nom); if ActifHnd <> 0 then begin ShowWindow(ActifHnd, SW_NORMAL); SetForegroundWindow(ActifHnd); end; end; function FindAWindow(ACaption: string): THandle; var WindowInfo: TFindWindowStruct; begin with WindowInfo do begin Caption:= ACaption; ClassName:= ''; WindowHandle:= 0; EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo)); result:= WindowHandle; //showmessage(IntTostr(result)); end; end; function EnumWindowsProc(hWindow: hWnd;lParam : LongInt): Boolean; stdcall; var lpBuffer: PChar; WindowCaptionFound: bool; ClassNameFound: bool; begin GetMem(lpBuffer, 255); Result:= True; WindowCaptionFound:= False; ClassNameFound:= False; try if GetWindowText(hWindow, lpBuffer, 255) > 0 then if Pos(PFindWindowStruct(lParam).Caption, StrPas(lpBuffer)) = 1 then begin WindowCaptionFound:= true; if PFindWindowStruct(lParam).ClassName = '' then ClassNameFound:= True else if GetClassName(hWindow, lpBuffer, 255) > 0 then if Pos(PFindWindowStruct(lParam).ClassName, StrPas(lpBuffer)) > 0 then ClassNameFound:= True; end; if (WindowCaptionFound and ClassNameFound) then begin PFindWindowStruct(lParam).WindowHandle:= hWindow; Result:= False; end; finally FreeMem(lpBuffer, sizeof(lpBuffer^)); end; end; end.
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Merci Shai
T'es vraiment top. Merci beaucoup.
Je me demande bien comment je pourrai te rendre la pareille.
Pour des algos, des simplications laisse moi savoir
Merci encore
A+
moi, j'utilise le composant JvAppInstances que se trouve dans la bibliothèque Jedi - JVCL au cas ou tu aurais cette bibliothèque ...
J'invoquais dernièrement SetProp/GetProp et c'est typiquement un cas où je l'utiliserais :
Plus léger non
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 procedure TForm1.FormCreate(Sender: TObject); begin SetProp(Handle, 'MonAppIdentifier', 1); end; function EnumWindowsProc(hWindow: hWnd;lParam : LongInt): Boolean; stdcall; begin Result := GetProp(hWindow, 'MonAppIdentifier') = 1; end;
De plus, ça fonctionne même si le titre de la fenêtre est sujet à variation
l'API SetProp est très intéressante !
Je ne connaissais pas !
Si un jour j'ai l'occasion de mettre un UniqueInstance dans une application ce que je n'ai pas fait depuis des années, j'utiliserais ton astuce !
J'y vois aussi un intérêt pour ma classe d'échange de données inter-process !
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Ou alors on crée son mutex non pas avec le nom de l'application mais avec un GUID (ex: b6993aa9-fa94-41fc-ac7e-d495786added) (il y a des générateurs en ligne)
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager