OVH Cloud OVH Cloud

Savoir si la fenêtre active est modale

17 réponses
Avatar
SAISAS
Bonjour,

je voudrais vérifier si la fenêtre affichée est modale ou non. Savez vous
comment faire?

Merci.

7 réponses

1 2
Avatar
Guy DETIENNE
Salut ;O)

En effet, je n'ai jamais eu à me demander si une form était modale ou pas à
travers mes applis...
Etrange donc.

Guy


"Guy DETIENNE" a écrit dans le message de
news:
Salut ;O)

Partant de cette idée logique:
Une formulaire modal n'a de sens que s'il est appelé à partir d'un autre
formulaire.
Le but du style modal est d'empêcher l'utilisation de la fenêtre appelante
avant d'avoir fermé la fenêtre appelée (comme une message box).

Un seul et unique formulaire modal dans une application n'a à vrai dire
aucun sens.

Sachons que lorsqu'un formulaire ouvre un autre formulaire via la méthode
Show avec comme style VbModal, le style du formulaire appelant passe
aussitôt à Disabled (WS_DISABLED).
C'est la règle dans Windows.

L'on pourrait grâce à l'API GetWindowLong récupérer le style de la fenêtre
appelante et tester le flag WS_DISABLED (&H8000000) pour connaître son


état.
Ceci est la version longue : Exemple d'une fonction IsWindowModal :

Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd


As
Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal
hWnd As Long, ByVal nIndex As Long) As Long

Public Const WS_DISABLED = &H8000000
Public Const GWL_STYLE = (-16)

Public Function IsWindowModal(hWnd As Long) As Boolean

Dim hwndOwner As Long
hwndOwner = GetWindow(hWnd, GW_OWNER)
If hwndOwner Then
IsWindowModal = (GetWindowLong(hwndOwner, GWL_STYLE) And WS_DISABLED)
End If

End Function


Cepdendant, il existe un raccourci efficace au code ci-dessus.
L'utilisation de l'API IsWindowEnabled.
Pour illustrer l'utilisation de cette API, il faudra créer 2 formulaires
(Form1 et Form2).
Form1 possède un bouton qui appellera Form2 de façon modale - le code :
Form2.Show vbModal
Form2 possède un bouton avec le code suivant (qui donnera l'état de la
fenêtre appelante): MsgBox IsWindowEnabled(Form1.hwnd)
Un module avec ce code-ci : Public Declare Function IsWindowEnabled Lib
"user32" (ByVal hwnd As Long) As Long

Lancer Form1, puis cliquer le bouton et Form2 apparaît de façon modale.
Impossible donc de retourner sur Form1 sans avoir quitté Form2.
Cliquer sur le bouton de Form2 et la MsgBox donnera la valeur 0, ce qui
signifie que Form1 est Disabled car Form2 a modifié son état vu que Form2
est modal.
(Pour info, la valeur 1 est retournée si in formulaire est Enabled)

Voilà... C'est ainsi que je travaillerais si j'étais dans ce cas de


figure.
A prèsent, si ta notion de Form modal n'est pas celle décrite ci-dessus,
alors je ne peux rien pour toi, car il n'y a pas mille notions d'un Form
modal....

Guy






"SAISAS" a écrit dans le message de
news:
> Bonjour,
>
> je voudrais vérifier si la fenêtre affichée est modale ou non. Savez


vous
> comment faire?
>
> Merci.




Avatar
Jacques93
Bonjour à tous,
Guy DETIENNE a écrit :
Salut ;O)

En effet, je n'ai jamais eu à me demander si une form était modale ou pas à
travers mes applis...
Etrange donc.



Imagine une DLL ActiveX affichant une Form, un calendrier par exemple
(Mr X en a parlé sur un autre fil). Cette DLL peut être appelée a être
affichée sur une Form modal ou modeless, mais étant Out of Process la
Dll n'a pas de moyen de le savoir. Et si la Form appelante est en modal
et la Form de la dll en modeless => Erreur 401 .


--
Cordialement,

Jacques.
Avatar
X
Jacques, je vais le faire (calendrier), mais pas comme ça, soit en
exe autonome, soit (sûrement), en code à copier coller, car je m'aperçois
qu'on a beaucoup moins de problème quand tout parvient du code, notamment
pour distribuer avec les différentes versions d'OS et de dll...

Dans le cas que tu évoques, est-ce que ça ne peut pas se gérer par une
gestion d'erreur, si erreur 410, "relance" en non modal ???
Mais on peut aussi mettre disable les menus qui lacent des form, au moment
où on en lance une avec laquelle aucune autre ne doit tourner... On peut
aussi avec Me mettre au 1ere plan, c'est pas du modal, mais visuellement ce
n'est pas loin... Le toujours à l'écran avec API (mais là on sort de VB),
etc...

En fait, ce serait pas mal qu'avec une question le contexte soi
expliqué, ça permet de comprendre, là, preuve, tu en donnes un bon exemple
avec l'appel de DLL :o)


------
Site logiciels
http://irolog.free.fr
Mail
http://irolog.free.fr/ecrire/index.htm
Site perso
http://irolog.free.fr/joe/index.htm
Principe d'utilisation des news Groups
http://support.microsoft.com/directory/worldwide/fr/newsgroup/regles.htm
------------------------------------------------------------------------------------
"Jacques93" a écrit dans le message de news:

Bonjour à tous,
Guy DETIENNE a écrit :
Salut ;O)

En effet, je n'ai jamais eu à me demander si une form était modale ou pas
à
travers mes applis...
Etrange donc.



Imagine une DLL ActiveX affichant une Form, un calendrier par exemple (Mr
X en a parlé sur un autre fil). Cette DLL peut être appelée a être
affichée sur une Form modal ou modeless, mais étant Out of Process la Dll
n'a pas de moyen de le savoir. Et si la Form appelante est en modal et la
Form de la dll en modeless => Erreur 401 .


--
Cordialement,

Jacques.


Avatar
SAISAS
Bonjour,

merci à tous pour ces différentes informations très utiles.

Dans un premier temps, juste expliquer pourquoi j'ai besoin de savoir si la
fenêtre de mon application est modale: j'utilise un agent MSagent pour
fournir l'aide de mon application. L'agent permet justement d'activer du code
qui n'est pas dans la fenêtre modale pendant que celle-ci s'exécute : je peux
donc activer l'aide de mon application même si j'affiche une fenêtre modale,
en utiisant du code générique (j'ai le nom de ma fenêtre et le nom de ma zone
donc je vais chercher ce que je veux). Et lorsque je veux ouvrir une fenêtre
MDIchild à la demande de "Merlin" ... patatras.

Ceci étant j'aurais pu aussi développer un contrôle utilisateur voulant
savoir si la fenêtre qui l'utilise est modale ...

A propos, qui sait comment détecter que ma fenêtre est une message Box ou
une Input Box ?



"X" a écrit :

Jacques, je vais le faire (calendrier), mais pas comme ça, soit en
exe autonome, soit (sûrement), en code à copier coller, car je m'aperçois
qu'on a beaucoup moins de problème quand tout parvient du code, notamment
pour distribuer avec les différentes versions d'OS et de dll...

Dans le cas que tu évoques, est-ce que ça ne peut pas se gérer par une
gestion d'erreur, si erreur 410, "relance" en non modal ???
Mais on peut aussi mettre disable les menus qui lacent des form, au moment
où on en lance une avec laquelle aucune autre ne doit tourner... On peut
aussi avec Me mettre au 1ere plan, c'est pas du modal, mais visuellement ce
n'est pas loin... Le toujours à l'écran avec API (mais là on sort de VB),
etc...

En fait, ce serait pas mal qu'avec une question le contexte soi
expliqué, ça permet de comprendre, là, preuve, tu en donnes un bon exemple
avec l'appel de DLL :o)


------
Site logiciels
http://irolog.free.fr
Mail
http://irolog.free.fr/ecrire/index.htm
Site perso
http://irolog.free.fr/joe/index.htm
Principe d'utilisation des news Groups
http://support.microsoft.com/directory/worldwide/fr/newsgroup/regles.htm
------------------------------------------------------------------------------------
"Jacques93" a écrit dans le message de news:

> Bonjour à tous,
> Guy DETIENNE a écrit :
>> Salut ;O)
>>
>> En effet, je n'ai jamais eu à me demander si une form était modale ou pas
>> à
>> travers mes applis...
>> Etrange donc.
>
> Imagine une DLL ActiveX affichant une Form, un calendrier par exemple (Mr
> X en a parlé sur un autre fil). Cette DLL peut être appelée a être
> affichée sur une Form modal ou modeless, mais étant Out of Process la Dll
> n'a pas de moyen de le savoir. Et si la Form appelante est en modal et la
> Form de la dll en modeless => Erreur 401 .
>
>
> --
> Cordialement,
>
> Jacques.





Avatar
Jacques93
SAISAS a écrit :
Bonjour,

merci à tous pour ces différentes informations très utiles.

Dans un premier temps, juste expliquer pourquoi j'ai besoin de savoir si la
fenêtre de mon application est modale: j'utilise un agent MSagent pour
fournir l'aide de mon application. L'agent permet justement d'activer du code
qui n'est pas dans la fenêtre modale pendant que celle-ci s'exécute : je peux
donc activer l'aide de mon application même si j'affiche une fenêtre modale,
en utiisant du code générique (j'ai le nom de ma fenêtre et le nom de ma zone
donc je vais chercher ce que je veux). Et lorsque je veux ouvrir une fenêtre
MDIchild à la demande de "Merlin" ... patatras.

Ceci étant j'aurais pu aussi développer un contrôle utilisateur voulant
savoir si la fenêtre qui l'utilise est modale ...

A propos, qui sait comment détecter que ma fenêtre est une message Box ou
une Input Box ?



Tu parles des fenêtre affichées par les fonctions

MsgBox

et

InputBox

?

--
Cordialement,

Jacques.
Avatar
SAISAS
Oui

Merci.

"Jacques93" a écrit :

SAISAS a écrit :
> Bonjour,
>
> merci à tous pour ces différentes informations très utiles.
>
> Dans un premier temps, juste expliquer pourquoi j'ai besoin de savoir si la
> fenêtre de mon application est modale: j'utilise un agent MSagent pour
> fournir l'aide de mon application. L'agent permet justement d'activer du code
> qui n'est pas dans la fenêtre modale pendant que celle-ci s'exécute : je peux
> donc activer l'aide de mon application même si j'affiche une fenêtre modale,
> en utiisant du code générique (j'ai le nom de ma fenêtre et le nom de ma zone
> donc je vais chercher ce que je veux). Et lorsque je veux ouvrir une fenêtre
> MDIchild à la demande de "Merlin" ... patatras.
>
> Ceci étant j'aurais pu aussi développer un contrôle utilisateur voulant
> savoir si la fenêtre qui l'utilise est modale ...
>
> A propos, qui sait comment détecter que ma fenêtre est une message Box ou
> une Input Box ?
>
Tu parles des fenêtre affichées par les fonctions

MsgBox

et

InputBox

?

--
Cordialement,

Jacques.



Avatar
Jacques93
SAISAS a écrit :
Oui

Merci.

"Jacques93" a écrit :

SAISAS a écrit :
Bonjour,

merci à tous pour ces différentes informations très utiles.

Dans un premier temps, juste expliquer pourquoi j'ai besoin de savoir si la
fenêtre de mon application est modale: j'utilise un agent MSagent pour
fournir l'aide de mon application. L'agent permet justement d'activer du code
qui n'est pas dans la fenêtre modale pendant que celle-ci s'exécute : je peux
donc activer l'aide de mon application même si j'affiche une fenêtre modale,
en utiisant du code générique (j'ai le nom de ma fenêtre et le nom de ma zone
donc je vais chercher ce que je veux). Et lorsque je veux ouvrir une fenêtre
MDIchild à la demande de "Merlin" ... patatras.

Ceci étant j'aurais pu aussi développer un contrôle utilisateur voulant
savoir si la fenêtre qui l'utilise est modale ...

A propos, qui sait comment détecter que ma fenêtre est une message Box ou
une Input Box ?



Tu parles des fenêtre affichées par les fonctions

MsgBox

et

InputBox

?






Une piste : la fenêtre MsgBox a au moins deux fenêtres fille

Le label du message : Class = Static
Le(s) bouton(s) : Class = Button

la fenêtre InputBox a 4 fenêtres fille

Le label du message : Class = Static
Les 2 boutons : Class = Button
La zone de saisie : Class = Edit

En utilisant les API's EnumChildWindows et GetClassName, on doit pouvoir
déterminer si une des fenêtres est de la classe Edit, auquel cas c'est
un InputBox.

Ce n'est qu'une idée, il y a peut être plus simple :-)

--
Cordialement,

Jacques.
1 2