DÉSACTIVER LE BOUTON FERMER / X D'UNE FEUILLE VB

Tabarnak - 2 oct. 2001 à 15:22
rdelesalle Messages postés 3 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 20 février 2009 - 16 juin 2008 à 10:47
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/1903-desactiver-le-bouton-fermer-x-d-une-feuille-vb

rdelesalle Messages postés 3 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 20 février 2009
16 juin 2008 à 10:47
Bonjour.
Avec le code ci-dessous, je n'ai pas le problème.

Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Integer, ByVal bRevert As Integer) As Integer
Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Integer) As Integer
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Integer, ByVal nPosition As Integer, ByVal wFlags As Integer) As Integer
Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Integer) As Integer

Private Const MF_BYPOSITION As Integer = &H400
Private Const MF_REMOVE As Integer = &H1000

Private Sub DesactivePartieMenu()
Dim hMenu As Integer
Dim nCount As Integer
Dim hwnd As Int32 = Me.Handle.ToInt32
hMenu = GetSystemMenu(hwnd, 0)
nCount = GetMenuItemCount(hMenu)
RemoveMenu(hMenu, 4, MF_REMOVE Or MF_BYPOSITION) 'Suppression AGRANDIR
RemoveMenu(hMenu, 2, MF_REMOVE Or MF_BYPOSITION) 'Suppression TAILLE
RemoveMenu(hMenu, 0, MF_REMOVE Or MF_BYPOSITION) 'Suppression RESTAURER
DrawMenuBar(hwnd)
End Sub

Bon courage.
dreamsworks Messages postés 8 Date d'inscription jeudi 15 mai 2008 Statut Membre Dernière intervention 28 novembre 2009
14 juin 2008 à 18:43
Merci rdelesalle, ce probleme est résolu.

Mais un autre problème se produit lors du débogage : j'ai le message "PInvokeStackImbalance a été détecté" aux lignes 35, 38, 41, 42, 43 et 44. A ce moment là, les variables lItemCount, lRet et lSysMenu sont au alentour de 9E18. J'ai remarqué que cette valeur est en dehors de la plage de Long, je suis donc passé en single, mais cela n'a rien changé.
rdelesalle Messages postés 3 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 20 février 2009
26 mai 2008 à 09:40
Dim hwnd As Int32 = Me.Handle.ToInt32
dreamsworks Messages postés 8 Date d'inscription jeudi 15 mai 2008 Statut Membre Dernière intervention 28 novembre 2009
19 mai 2008 à 11:18
Je travaille sur Visual Studio 2005 et je rencontre le même problème que Laurent.
VS m'indique que "hwnd n'est pas un membre de Monformulaire".

j'ai tenté plusieurs fois mais rien n'y fait.

Aidez-moi !

merci
laurent colas Messages postés 3 Date d'inscription mardi 28 mars 2006 Statut Membre Dernière intervention 9 mars 2008
10 févr. 2008 à 11:06
Salut a tous.

Je suis avec VB2005 express et impossible de pourvoir utiliser hwnd. j'ai essaye a mainte reprise et cela me donne systématiquement a l'écriture du code :

"hwnd n'est pas un membre de mao.form1"

si quelqu'un a une idée?

merci
sunshune Messages postés 14 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 25 février 2006
6 oct. 2003 à 15:06
Felicitations

Depuis longtemps ke je cherche le moyen de faire cela.
Merci encore.

1000/20

Cordialement,
indianajones59 Messages postés 23 Date d'inscription jeudi 31 janvier 2002 Statut Membre Dernière intervention 10 février 2003
25 déc. 2002 à 19:04
parfait !
MagicManu Messages postés 19 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 23 janvier 2008
5 juin 2002 à 20:45
Comment faire pour réactiver la croix ?
Genre une fonction ReactiverX
Merci d'avance.
cs_Astalavista Messages postés 192 Date d'inscription lundi 24 décembre 2001 Statut Membre Dernière intervention 3 février 2010
28 mars 2002 à 22:45
Pour ceux qui veulen que la Form soit encore deplacable mettez :
Public Sub DesactiverX(f_hwnd As Long)
Dim lSysMenu As Long
Dim lItemCount As Long
Dim lRet As Long
lSysMenu = GetSystemMenu(f_hwnd, False)
lItemCount = GetMenuItemCount(lSysMenu)
lRet = RemoveMenu(lSysMenu, lItemCount - 1, MF_BYPOSITION)
lRet = RemoveMenu(lSysMenu, lItemCount - 3, MF_BYPOSITION)
lRet = RemoveMenu(lSysMenu, lItemCount - 4, MF_BYPOSITION)
End Sub
oki merci beaucoup !!!
En gros, le programme supprime le menu 'Fermer' (liste du menu lors du clic en haut à gauche de la feuille VB) et désactive le X de Fermer.
Plus en détail :
- la fonction API "GetSystemMenu" sert à prendre le menu qui apparaît lors du clic en haut à gauche du form (sous-menus "Restaurer", "Déplacer", "Réduire", "Fermer", ...)
- "GetMenuItemCount" sert à connaître le nombre de sous-menus dans ce même menu.
- "RemoveMenu" sert à enlever un de ces sous-menus.
arf Tabarnak...

dites moua, c possible d'expliquer ce ke font exactement ces api svp ? meme en faisant des test j'arrive po a savouar ce ke ca fé précisément...
mééé le code a changer?? escuse mwé :((
ta fumé tété? max12!!!!! met lui -2550505005050 cé du basique de calculatrice sa.... marche pô chez mwé...