Désactiver le bouton fermer / x d'une feuille vb

0/5 (14 avis)

Snippet vu 9 981 fois - Téléchargée 50 fois


Contenu du snippet


Source / Exemple :


'*****************************************
' Dans la partie déclaration du formulaire
'*****************************************
Private Const MF_BYPOSITION = &H400&

'Cette fonction API sert à prendre le menu qui apparaît lors du clic en haut à gauche du form (sous-menus "Restaurer", "Déplacer", "Réduire", "Fermer", ...)
Private Declare Function GetSystemMenu _
   Lib "user32" _
   (ByVal hwnd As Long, _ 
   ByVal bRevert As Long) As Long

'Cette fonction API sert à enlever un de ces sous-menus
Private Declare Function RemoveMenu _
   Lib "user32" (ByVal hMenu As Long, _ 
   ByVal nPosition As Long, _
   ByVal wFlags As Long) As Long

'Cette fonction API sert à connaître le nombre de sous-menus dans ce même menu
Private Declare Function GetMenuItemCount _
   Lib "user32" _ 
   (ByVal hMenu As Long) As Long

'*******************************************
' Dans la partie programmation du formulaire
'*******************************************
Public Sub DesactiverX(f_hwnd As Long)

Dim lSysMenu As Long
Dim lItemCount As Long
Dim lRet As Long

'Prend l'ID du menu
lSysMenu = GetSystemMenu(f_hwnd, False)

'Prend le nombre d'objet (sous-menus) du menu
lItemCount = GetMenuItemCount(lSysMenu)

'Suppression de sous-menu
lRet = RemoveMenu(lSysMenu, lItemCount - 1, MF_BYPOSITION)
lRet = RemoveMenu(lSysMenu, lItemCount - 2, MF_BYPOSITION)
lRet = RemoveMenu(lSysMenu, lItemCount - 3, MF_BYPOSITION)
lRet = RemoveMenu(lSysMenu, lItemCount - 4, MF_BYPOSITION)

End Sub

Conclusion :


En pratique :
DesactiverX Form1.hwnd
ou
Call DesactiverX(Form1.hwnd)

Dans le cas du formulaire actif :
DesactiverX Me.hwnd

A voir également

Ajouter un commentaire Commentaires
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
Afficher les 14 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.