24 mars 2011

INFOPATH : Desactiver fermeture formulaire

Aujourd'hui un petit post afin de parler d'une fonctionnalité souvent souhaitée dans les formulaires InfoPath : a savoir, le masquage de la croix de fermeture du formulaire (cela permet de maitriser l'utilisation du formulaire par l'utilisateur puisqu'il sera obligé de fermer par un bouton dans le formulaire).
Pour cela, il faut utiliser du code managé dans le formulaire InfoPath (à insérer dans la classe 'FormCode'):
private const int SC_CLOSE = 61536;
private const int MF_BYCOMMAND = 0;
private const int MF_GRAYED = 1;
private const int MF_ENABLED = 0;

// Récupère le handle d'une fenêtre à partir de son titre
[DllImport("user32.dll", EntryPoint = "FindWindowA")]
private static extern int FindWindow(string lpClassName, string lpWindowName);

// Fonctions de gestions des menus systèmes windows
[DllImport("user32.dll")]
private static extern int GetSystemMenu(int hwnd, int revert);
[DllImport("user32.dll")]
private static extern int EnableMenuItem(int menu, int ideEnableItem, int enable);

public static void Disable(int handle)
{
// 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.
switch (EnableMenuItem(GetSystemMenu(handle, 0), SC_CLOSE, (MF_BYCOMMAND
MF_GRAYED)))
{
case MF_ENABLED:
break;
case MF_GRAYED:
break;
default:
// throw new Exception("Le handle ne renvoie rien.");
break;
}
}

Ensuite il faut copier ces 3 lignes de code dans la partie "form_loading" de votre formulaire (Pour appeler cet évènement, il faut aller dans le menu "Insertion" d'InfoPath puis cliquer sur "Evènement au chargement"):

int myWindow;
myWindow = FindWindow(null, this.Application.Name);
Disable(myWindow);
Par contre, cette méthode appelant des composants système, il faudra que le formulaire soit en mode "Full Trust" au niveau de la sécurité (Onglet "Outils/Options du formulaire/Sécurité").

Cette méthode a été implémentée sur un projet InfoPath 2007 et fonctionne à merveille.

Aucun commentaire:

Enregistrer un commentaire