2017-10-19 2 views
0

ProblemWie wird ein modales Dialogfeld zum Schließen in Microsoft PowerPoint/Office-Anwendungen ausgelöst?

Ich versuche, ein geöffnetes WPF Dialogfeld in Powerpoint mit einem VSTO Addin zu erkennen und zu schließen. Wenn ich die Lösung von this question benutze, scheint es nicht zu funktionieren, weil System.Windows.Application.Current immer Null zurückgibt, obwohl ein Dialogfeld geöffnet ist.

-Code

Statt den Standard Winform als Dialogfeld zu verwenden, mein Dialogfeld ist ein WPF-Fenster, zum Beispiel

<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> 

Dies ist die Code-behind:

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

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

Ich verwende diese Methode, um das WPF-Fenster über

zu öffnen

Aber Lauf System.Windows.Application.Current immer Null zurückgeben.

Antwort

0

Ich benutze win32 API FindWindow, um die Zeigerreferenz des Dialogfelds zu finden, die mit dem Titel oder Titel des Dialogfelds geschlossen werden soll. Dann verwende ich Win32 SendMessage, um das richtige Dialogfeld zum Schließen mithilfe der Zeigerreferenz, die zuvor gefunden wurde, zu schließen.

Setzen Sie diese Code in jede Ihrer Klasse:

[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; 
    } 

So kann es wie verwendet werden:

YourClass.CloseWindowIfOpen("CaptionOfModalDialog"); 

Hinweis

Bisher kann ich dies nur erfolgreich indem Sie die Beschriftung des zu schließenden Dialogfelds eingeben. Sie sollten auch in der Lage sein, den Klassennamen des Dialogfelds zu verwenden, aber das ist mir nicht gelungen. Beispielsweise befindet sich der Klassenname meines Dialogfelds DlgCustomWindow in Namespace: AddInProject.Classes. FindWindow konnte den modalen Dialog nicht finden, wenn ich FindWindow("DlgCustomWindow",name) oder FindWindow("AddInProject.Classes.DlgCustomWindow",name)

verwendet habe
Verwandte Themen