IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

InfoPath .NET Discussion :

Désactiver la croix de fermeture dans un formulaire InfoPath [IP-2007]


Sujet :

InfoPath .NET

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 28
    Points : 35
    Points
    35
    Par défaut Désactiver la croix de fermeture dans un formulaire InfoPath
    Bonjour,

    je viens de terminer un formulaire sous InfoPath 2007 dont je souhaite désactiver la croix de fermeture dans la fenêtre où s'ouvre le formulaire.

    J'ai déjà fait des recherches et j'ai trouvé le code suivant:
    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
    Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Integer, ByVal revert As Integer) As Integer
            Private Declare Function EnableMenuItem Lib "user32" (ByVal menu As Integer, ByVal ideEnableItem As Integer, ByVal enable As Integer) As Integer
            Private Const SC_CLOSE As Integer = &HF060
            Private Const MF_BYCOMMAND As Integer = &H0
            Private Const MF_GRAYED As Integer = &H1
            Private Const MF_ENABLED As Integer = &H0
            Public Shared Sub Disable(ByVal form As System.Windows.Forms.Form)
            '     The return value specifies the previous state of the menu item (it is either 
            '     MF_ENABLED or MF_GRAYED). 0xFFFFFFFF indicates   that the menu item does not exist.
                Select Case EnableMenuItem(GetSystemMenu(form.Handle.ToInt32, 0), SC_CLOSE, MF_BYCOMMAND Or MF_GRAYED)
                    Case MF_ENABLED
                    Case MF_GRAYED
                    Case &HFFFFFFFF
                        Throw New Exception("La croix pour fermer n'existe pas.")
                    Case Else
                End Select
            End Sub
    Il me suffit ensuite d'appeler la procédure "Disable" dans le code événement Form_loading et le tour est joué.

    Mais ça ne marche pas comme ça:

    - Pour appeler "Disable", j'ai besoin de pointer sur une instance de System.Windows.Forms.Form
    - Tout ce que j'ai c'est une instance de la classe Microsoft.Office.InfoPath.XmlForm, ou à la rigueur de Microsoft.Office.InfoPath.Window
    - Dans ces objets, je n'ai aucun lien avec la classe System.Windows.Forms.Form ou System.Windows (un essai de cast me renvoie que mes deux classes sont incompatibles)
    Je pense avoir donné un maximum d'éléments, mais je n'ai pas codé depuis très longtemps, et l'objet est une notion encore floue.

    Note: je programme en VB sous Visual Studio 2005.

    Merci d'avance de m'aider à trouver la solution.

  2. #2
    Nouveau membre du Club
    Inscrit en
    Septembre 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 28
    Points : 35
    Points
    35
    Par défaut
    J'ai un peu avancé sur mon problème, et je crois avoir trouvé une solution de rechange, mais là encore, ça coince...

    J'utilise les objets CommandBars de Microsoft.Office.Infopath.Application.Windows, castés dans la classe Microsoft.Office.Core.CommandBars.

    J'ai trouvé l'objet CommandBar de nom 'System', dont les contrôles contiennent, entre autres, le msoControlButton 'Fermer'.

    Mais quand j'applique le code:
    Dans l'inclusion des domaines de noms:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Imports Microsoft.Office.Core
    Dans mon code évènement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim myCommandBars As CommandBars = DirectCast(Me.Application.ActiveWindow.CommandBars, CommandBars)
     
    myCommandBars.Item(26).Controls.Item(6).Enabled = False
    J'ai le message d'erreur:
    System.Runtime.InteropServices.COMException
    Une erreur HRESULT E_FAIL a été retournée à partir d'un appel à un composant COM.
    à Microsoft.Office.Core.CommandBarControl.set_Enabled(Boolean pvarfEnabled)
    à Modèle11.FormCode.FormEvents_Loading(Object sender, LoadingEventArgs e)
    à Microsoft.Office.InfoPath.Internal.FormEventsHost.OnLoad(DocReturnEvent pEvent)
    à Microsoft.Office.Interop.InfoPath.SemiTrust._XDocumentEventSink2_SinkHelper.OnLoad(DocReturnEvent pEvent)

    Alors je ne sais plus comment faire.
    Aidez-moi SVP, même des vagues indices feront l'affaire.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 28
    Points : 35
    Points
    35
    Par défaut
    J'ai fini par trouver, en fait c'était assez simple.

    L'idée c'est simplement de récupérer le handle de la fenêtre où le formulaire démarre.

    Avant tout, importer les dll suivantes au début du code source:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Imports Microsoft.Office.InfoPath
    Imports System
    Imports System.Windows.Forms
    Imports System.Windows
    Imports System.Xml
    Imports System.Xml.XPath
    'Inclusion des DLL ajoutées manuellement
    Imports Microsoft.VisualBasic.Interaction
    Imports Microsoft.Office.Core
    'Fin Inclusion

    Dans les déclarations de classe du FormCode.vb (avant la procédure InternalStartup), on doit mettre:
    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
    'Récupère le handle d'une fenêtre à partir de son titre
            Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
            'Fonctions de gestions des menus systèmes windows
            Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Integer, ByVal revert As Integer) As Integer
            Private Declare Function EnableMenuItem Lib "user32" (ByVal menu As Integer, ByVal ideEnableItem As Integer, ByVal enable As Integer) As Integer
            'Constantes pour utiliser la fonction EnableMenuItem
            Private Const SC_CLOSE As Integer = &HF060
            Private Const MF_BYCOMMAND As Integer = &H0
            Private Const MF_GRAYED As Integer = &H1
            Private Const MF_ENABLED As Integer = &H0
            Public Shared Sub Disable(ByVal handle As Integer)
                '     The return value specifies the previous state of the menu item (it is either 
                '     MF_ENABLED or MF_GRAYED). 0xFFFFFFFF indicates   that the menu item does not exist.
                Select Case EnableMenuItem(GetSystemMenu(handle, 0), SC_CLOSE, MF_BYCOMMAND Or MF_GRAYED)
                    Case MF_ENABLED
                    Case MF_GRAYED
                    Case &HFFFFFFFF
                        Throw New Exception("La croix pour fermer n'existe pas.")
                    Case Else
                        Throw New Exception("Le handle ne renvoie rien.")
                End Select
            End Sub
    Ensuite, dans la procédure FormEvents_Loading on met:
    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
    '///Désactive la case fermer de la fenêtre hébergeant le formulaire///
                    'Récupère le hwnd de la fenêtre active InfoPath
                    Dim myWindow As Integer
                    myWindow = FindWindow(Microsoft.VisualBasic.vbNullString, Me.Application.Name)
                    'Avec le Hwnd, on peut appeler Disable
                    Disable(myWindow)
     
                    '///Désactive les barres de menu dans la fenêtre pour tout utilisateur sauf "tlamy"///
                    'Récupère les objets barres de commande de la fenêtre d'application
                    Dim myCommandBars As CommandBars = DirectCast(Me.Application.Windows(0).CommandBars, CommandBars)
     
                    Dim i As Integer
     
                    If (Me.Application.User.UserName = "tlamy") Then
                        For i = 1 To myCommandBars.Count
                            myCommandBars.Item(i).Enabled = True
                        Next i
                    Else
                        For i = 1 To myCommandBars.Count
                            myCommandBars.Item(i).Enabled = False
                        Next i
                    End If
    Et pour terminer, dans le code évènement du bouton destiné à la fermeture du formulaire:
    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
    Dim myConfirmation As Microsoft.VisualBasic.MsgBoxResult
                    myConfirmation = MsgBox("Vous allez quitter le formulaire sans l'avoir enregistré. Etes-vous sûr de vouloir faire cela?", Microsoft.VisualBasic.MsgBoxStyle.YesNo, "Avertissement")
                    If myConfirmation = Microsoft.VisualBasic.MsgBoxResult.Yes Then
                        '///Réactive les barres de menu dans la fenêtre///
                        'Récupère les objets barres de commande de la fsenêtre d'application
                        Dim myCommandBars As CommandBars = DirectCast(Me.Application.ActiveWindow.CommandBars, CommandBars)
                        'Réactive les barres de menu dans la fenêtre désactivés au chargement
                        Dim i As Integer
     
                        For i = 1 To myCommandBars.Count
                            myCommandBars.Item(i).Enabled = True
                        Next i
                        '///Ferme InfoPath///
                        Me.Application.ActiveWindow.Close()
                    End If
    Voila, voila...

    Je pense que ce code peut être adapté sans trop de mal pour toutes les fenêtres issue d'applications Office 2007.

    Si ça peut vous servir, tant mieux.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Référent technique
    Inscrit en
    Juillet 2007
    Messages
    834
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Référent technique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 834
    Points : 1 219
    Points
    1 219
    Par défaut
    Merci bcp pour ce petit question-réponse qui peut-être fort utile.
    A garder sous le coude!
    Rémi MATAYRON
    N'hésitez pas à visiter mon blog dédié à InfoPath et SharePoint : http://rmatayron.blogspot.com/

    Pour plus de visibilité sur le forum, marquer la question en [Résolu] lorsque la réponse fournie vous convient.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Désactiver la croix de fermeture ou des touches
    Par JM741 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/04/2011, 14h07
  2. [AC-2007] Désactiver l'appui sur Entrée dans un formulaire
    Par syntax_error dans le forum IHM
    Réponses: 2
    Dernier message: 20/09/2010, 14h54
  3. [AS 2.0] Désactiver la croix de fermeture.
    Par TRUNKS-SSJ7 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 07/06/2009, 20h52
  4. Supprimer la croix de fermeture dans une Form
    Par lio33 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 03/07/2008, 16h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo