OVH Cloud OVH Cloud

Interdire 2 lancement même applie ???

5 réponses
Avatar
LE TROLL
Bonjour,

Je cherche comment interdire 2 lancements depuis la même applie, j'ai
bien ça:

Sub Form_Load()
If App.PrevInstance Then: End
End Sub

Mais ça ne marche pas car je lance depuis une feuille le bloc-notes,
ainsi:

Sub m_obs_Click()
Dim rep
rep = Shell("NotePad.exe " & App.Path & "\Tarotobs.txt", 1)
End Sub

Je vois bien deux moyens lourds de faire ça:
- Lire les processus, et si je trouve le mien je refuse le lancement...
- Utiliser ShellExecut, car je crois qu'on a le retour...

Que voyez-vous comme solution (la plus courte), afin d'interdire de
lancer le bloc-notes plusieurs fois ???

--
Merci beaucoup, au revoir et à bientôt :o)
------
Site de MES LOGICIELS
http://irolog.free.fr
Site éditeur de MES ROMANS édités
http://irolog.free.fr/romans
mon adresse EMail
http://irolog.free.fr/ecrire/index.htm
------------------------------------------------------------------------------------

5 réponses

Avatar
Jacques93
Bonjour LE TROLL,
LE TROLL a écrit :
Bonjour,

Je cherche comment interdire 2 lancements depuis la même applie, j'ai
bien ça:

Sub Form_Load()
If App.PrevInstance Then: End
End Sub

Mais ça ne marche pas car je lance depuis une feuille le bloc-notes,
ainsi:

Sub m_obs_Click()
Dim rep
rep = Shell("NotePad.exe " & App.Path & "Tarotobs.txt", 1)
End Sub

Je vois bien deux moyens lourds de faire ça:
- Lire les processus, et si je trouve le mien je refuse le lancement...
- Utiliser ShellExecut, car je crois qu'on a le retour...

Que voyez-vous comme solution (la plus courte), afin d'interdire de
lancer le bloc-notes plusieurs fois ???




Ne voyant pas pourquoi tu interdirai à l'utilisateur de lancer plusieurs
fois le bloc-notes, avec les documents de son choix, j'en déduis que tu
ne veux pas que ton programme le lance plusieurs fois avec le document
Tarotobs.txt. Si j'ai bon jusque là, il suffit de rechercher la fenêtre

Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

Private Sub ChercheFenetre()
Dim lResult As Long

lResult = FindWindow("Notepad", "Tarotobs.txt - Bloc-notes")
If lResult = 0 Then
MsgBox "Pas ouvert"
Else
MsgBox "Déja ouvert"
End If
End Sub

NB : App.PrevInstance ne concerne que l'instance du programme VB lui même.


--
Cordialement,

Jacques.
Avatar
LE TROLL
Merci Jacques, j'étudie la question :o)

Oui, en effet, je veux interdire plusieurs lancements par le bloc-notes
d'un fichier, car ça fait programmation baclée (mon point de vue), de
permettre de lancer en vrac le même fichier...

--
Site de MES LOGICIELS
http://irolog.free.fr
Site éditeur de MES ROMANS édités
http://irolog.free.fr/romans
mon adresse EMail
http://irolog.free.fr/ecrire/index.htm
------------------------------------------------------------------------------------
"Jacques93" a écrit dans le message de news:
O%
Bonjour LE TROLL,
LE TROLL a écrit :
Bonjour,

Je cherche comment interdire 2 lancements depuis la même applie, j'ai
bien ça:

Sub Form_Load()
If App.PrevInstance Then: End
End Sub

Mais ça ne marche pas car je lance depuis une feuille le bloc-notes,
ainsi:

Sub m_obs_Click()
Dim rep
rep = Shell("NotePad.exe " & App.Path & "Tarotobs.txt", 1)
End Sub

Je vois bien deux moyens lourds de faire ça:
- Lire les processus, et si je trouve le mien je refuse le lancement...
- Utiliser ShellExecut, car je crois qu'on a le retour...

Que voyez-vous comme solution (la plus courte), afin d'interdire de
lancer le bloc-notes plusieurs fois ???




Ne voyant pas pourquoi tu interdirai à l'utilisateur de lancer plusieurs
fois le bloc-notes, avec les documents de son choix, j'en déduis que tu ne
veux pas que ton programme le lance plusieurs fois avec le document
Tarotobs.txt. Si j'ai bon jusque là, il suffit de rechercher la fenêtre

Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

Private Sub ChercheFenetre()
Dim lResult As Long

lResult = FindWindow("Notepad", "Tarotobs.txt - Bloc-notes")
If lResult = 0 Then
MsgBox "Pas ouvert"
Else
MsgBox "Déja ouvert"
End If
End Sub

NB : App.PrevInstance ne concerne que l'instance du programme VB lui même.


--
Cordialement,

Jacques.


Avatar
LE TROLL
Jacques, ça marche très bien, merci encore, mais... question, dans:

lResult = FindWindow("Notepad", "Tarotobs.txt - Bloc-notes")

Comment sais-tu que le fichier "Tarotobs.txt" tu dois l'appeler
"Tarotobs.txt - Bloc-notes" ???

--
Merci beaucoup, au revoir et à bientôt :o)
------
Site de MES LOGICIELS
http://irolog.free.fr
Site éditeur de MES ROMANS édités
http://irolog.free.fr/romans
mon adresse EMail
http://irolog.free.fr/ecrire/index.htm
------------------------------------------------------------------------------------
"Jacques93" a écrit dans le message de news:
O%
Bonjour LE TROLL,
LE TROLL a écrit :
Bonjour,

Je cherche comment interdire 2 lancements depuis la même applie, j'ai
bien ça:

Sub Form_Load()
If App.PrevInstance Then: End
End Sub

Mais ça ne marche pas car je lance depuis une feuille le bloc-notes,
ainsi:

Sub m_obs_Click()
Dim rep
rep = Shell("NotePad.exe " & App.Path & "Tarotobs.txt", 1)
End Sub

Je vois bien deux moyens lourds de faire ça:
- Lire les processus, et si je trouve le mien je refuse le lancement...
- Utiliser ShellExecut, car je crois qu'on a le retour...

Que voyez-vous comme solution (la plus courte), afin d'interdire de
lancer le bloc-notes plusieurs fois ???




Ne voyant pas pourquoi tu interdirai à l'utilisateur de lancer plusieurs
fois le bloc-notes, avec les documents de son choix, j'en déduis que tu ne
veux pas que ton programme le lance plusieurs fois avec le document
Tarotobs.txt. Si j'ai bon jusque là, il suffit de rechercher la fenêtre

Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

Private Sub ChercheFenetre()
Dim lResult As Long

lResult = FindWindow("Notepad", "Tarotobs.txt - Bloc-notes")
If lResult = 0 Then
MsgBox "Pas ouvert"
Else
MsgBox "Déja ouvert"
End If
End Sub

NB : App.PrevInstance ne concerne que l'instance du programme VB lui même.


--
Cordialement,

Jacques.


Avatar
Jacques93
Bonjour LE TROLL,
LE TROLL a écrit :
Jacques, ça marche très bien, merci encore, mais... question, dans:

lResult = FindWindow("Notepad", "Tarotobs.txt - Bloc-notes")

Comment sais-tu que le fichier "Tarotobs.txt" tu dois l'appeler
"Tarotobs.txt - Bloc-notes" ???




En fait, l'API FindWindow recherche un titre de fenêtre correspondant au
deuxième paramètre. Pour les applications qui gèrent des documents, il
est d'usage (me semble t-il), d'utiliser le format :

NomDuDocument.[Ext]<Espace>-<Espace>NomDuProgramme

(L'extension n'est pas systématique, certaine applications gérant
plusieurs formats)

Donc, ici :

"Tarotobs.txt - Bloc-notes"

Si le nom de ton document est dans une variable :

NomDuDocument & " - Bloc-notes"

Dans le cas présent cela peut poser un problème avec une version non
francophone, où le Bloc-notes doit s'appeler différemment.

Cela serait bel et bien, si Microsoft respectait cette règle, et l'on
pourrait s'attendre à avoir, par exemple :

Classeur.xls - Microsoft Excel
Document.doc - Microsoft Word

et ben non, et me demande pas pourquoi :-) , on a

Microsoft Excel - Classeur.xls
Document.doc - Microsoft Word

Il y a également le cas d'Internet Explorer dont on peut personnaliser
le titre, grâce à la clé 'Windows Title' de la branche :

HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerMain

du registre.

Sans oublier les applications qui ne gèrent pas de documents, et dont le
titre se résume à leur nom.

<HS : Un peu de Promo>
Google Earth, par exemple, dont la version 4 n'est plus en bêta et
intègre la 3D et les textures, pour ceux qui n'aurait pas vu passer
l'information.
</HS : Un peu de Promo>

Tout cela pour dire qu'en fait, il n'y a pas vraiment de règles, et
qu'il faut faire des essais afin de voir comment est constitué le titre
de la fenêtre que l'on va rechercher.

NB : Le premier paramètre correspond au nom de la classe à laquelle la
fenêtre appartient. L'utilitaire Spy++ de Visual Studio permet de le
retrouver très simplement. Ici cela correspond au nom de l'exécutable,
mais ce n'est pas systématique :

Programme Classe

Notepad.exe Notepad
Excel.exe XLMAIN
Winword.exe OpusApp

'Office 2003)

et piège ultime :

Feuille VB6 dans l'IDE ThunderFormDC
Feuille VB6 dans un EXE ThunderRT6FormDC

Je ne peux pas vérifier, mais pour vb5, je pense que c'est :

ThunderRT5FormDC

Etonnant, non ;-)

--
Cordialement,

Jacques.
Avatar
LE TROLL
Ah, merci... ennuyeux ça, car je fais en 3 langues (fr, ang, esp), alors je
vais garder l'info et je vais afficher en interne avec une form...

Merci pour gogole heart, je vais télécharger la maj, j'aime beaucoup, il y a
aussi le français "galiléo" ? je crois ? Mais je ne sais pas s'il s'est
amélioré, à l'époque il était moins bon que gogol...

Cordialement.

--
Site de MES LOGICIELS
http://irolog.free.fr
Site éditeur de MES ROMANS édités
http://irolog.free.fr/romans
mon adresse EMail
http://irolog.free.fr/ecrire/index.htm
------------------------------------------------------------------------------------
"Jacques93" a écrit dans le message de news:
%239$
Bonjour LE TROLL,
LE TROLL a écrit :
Jacques, ça marche très bien, merci encore, mais... question, dans:

lResult = FindWindow("Notepad", "Tarotobs.txt - Bloc-notes")

Comment sais-tu que le fichier "Tarotobs.txt" tu dois l'appeler
"Tarotobs.txt - Bloc-notes" ???




En fait, l'API FindWindow recherche un titre de fenêtre correspondant au
deuxième paramètre. Pour les applications qui gèrent des documents, il est
d'usage (me semble t-il), d'utiliser le format :

NomDuDocument.[Ext]<Espace>-<Espace>NomDuProgramme

(L'extension n'est pas systématique, certaine applications gérant
plusieurs formats)

Donc, ici :

"Tarotobs.txt - Bloc-notes"

Si le nom de ton document est dans une variable :

NomDuDocument & " - Bloc-notes"

Dans le cas présent cela peut poser un problème avec une version non
francophone, où le Bloc-notes doit s'appeler différemment.

Cela serait bel et bien, si Microsoft respectait cette règle, et l'on
pourrait s'attendre à avoir, par exemple :

Classeur.xls - Microsoft Excel
Document.doc - Microsoft Word

et ben non, et me demande pas pourquoi :-) , on a

Microsoft Excel - Classeur.xls
Document.doc - Microsoft Word

Il y a également le cas d'Internet Explorer dont on peut personnaliser le
titre, grâce à la clé 'Windows Title' de la branche :

HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerMain

du registre.

Sans oublier les applications qui ne gèrent pas de documents, et dont le
titre se résume à leur nom.

<HS : Un peu de Promo>
Google Earth, par exemple, dont la version 4 n'est plus en bêta et
intègre la 3D et les textures, pour ceux qui n'aurait pas vu passer
l'information.
</HS : Un peu de Promo>

Tout cela pour dire qu'en fait, il n'y a pas vraiment de règles, et qu'il
faut faire des essais afin de voir comment est constitué le titre de la
fenêtre que l'on va rechercher.

NB : Le premier paramètre correspond au nom de la classe à laquelle la
fenêtre appartient. L'utilitaire Spy++ de Visual Studio permet de le
retrouver très simplement. Ici cela correspond au nom de l'exécutable,
mais ce n'est pas systématique :

Programme Classe

Notepad.exe Notepad
Excel.exe XLMAIN
Winword.exe OpusApp

'Office 2003)

et piège ultime :

Feuille VB6 dans l'IDE ThunderFormDC
Feuille VB6 dans un EXE ThunderRT6FormDC

Je ne peux pas vérifier, mais pour vb5, je pense que c'est :

ThunderRT5FormDC

Etonnant, non ;-)

--
Cordialement,

Jacques.