2017-10-19 21 views
0

ProblèmeComment faire pour fermer une boîte de dialogue modale dans des applications Microsoft PowerPoint/Office?

Je suis en train de détecter et fermer une boîte de dialogue WPF ouvert dans PowerPoint à l'aide d'un add-in VSTO. Lorsque j'utilise la solution à partir de this question, cela ne semble pas fonctionner car System.Windows.Application.Current renvoient toujours un résultat nul tant qu'une boîte de dialogue est ouverte.

code

Au lieu d'utiliser la Winform par défaut comme boîte de dialogue, ma boîte de dialogue est une fenêtre WPF, par exemple,

<Window 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     x:Name="Test" 
     WindowStyle="None" 
     SizeToContent="WidthAndHeight"> 
... 
</Window> 

Voici le code-behind:

namespace AddInProject.Classes 
{ 
    public partial class DlgCustomWindow:Window, IDisposable 
    { 
     public CustomWindow() 
     { 
      InitializeComponent(); 
     } 

     public Dispose() 
     { 
      this.Close(); 
     } 
    } 
} 

J'utilise cette méthode pour ouvrir la fenêtre WPF ci-dessus

 using (DlgCustomWindow dlgCustom = new DlgCustomWindow()) 
     { 
      dlgCustom.ShowDialog(); 
     } 

Mais l'exécution System.Windows.Application.Current renvoie toujours null.

Répondre

0

J'utilise win32 API FindWindow pour trouver la référence du pointeur de la boîte de dialogue à fermer en utilisant la légende ou le titre de la boîte de dialogue. Ensuite, j'utilise le SendMessage de win32 pour déclencher la fermeture de la boîte de dialogue en utilisant la référence de pointeur trouvée précédemment.

Mettez ces codes dans l'une de votre classe:

[DllImport("user32.dll",SetLastError = true)] 
    private static extern IntPtr FindWindow(string lpClassName,string lpWindowName); 
    [DllImport("user32.dll",CharSet = CharSet.Auto)] 
    private static extern IntPtr SendMessage(IntPtr hWnd,UInt32 Msg,IntPtr wParam,IntPtr lParam); 

    public static bool CloseWindowIfOpen(string name = "") 
    { 
     IntPtr hWnd = (IntPtr)0; 
     hWnd = FindWindow(null,name); 
     if ((int)hWnd!=0) 
     { 
      //Close Window 
      SendMessage(hWnd,WM_CLOSE,IntPtr.Zero,IntPtr.Zero); 
      return true; 
     } 
     return false; 
    } 

Ainsi, il peut être utilisé comme:

YourClass.CloseWindowIfOpen("CaptionOfModalDialog"); 

Remarque

Jusqu'à présent, je ne peux le faire avec succès en entrant la légende de la boîte de dialogue à fermer. Vous devriez également pouvoir utiliser le nom de classe de la boîte de dialogue mais je n'ai pas réussi à cela. Par exemple, mon nom de classe de boîte de dialogue, DlgCustomWindow, est situé dans l'espace de noms: AddInProject.Classes. FindWindow n'a pas pu trouver la boîte de dialogue modale lorsque j'ai utilisé FindWindow("DlgCustomWindow",name) ou FindWindow("AddInProject.Classes.DlgCustomWindow",name)