2017-10-19 21 views
0

問題私が検出し、VSTOアドインを使用して、PowerPointで開かれたWPFのダイアログボックスを閉じますしようとしているMicrosoft PowerPoint/Officeアプリケーションでモーダルダイアログボックスを閉じる方法を教えてください。

this questionのソリューションを使用すると、ダイアログボックスが開いているのに、System.Windows.Application.Currentが常にnullイベントを返すため、動作していないようです。

コード

代わりにダイアログボックスとしてデフォルトのWinフォームを使用しての、私のダイアログボックスがWPFウィンドウで、例えば、

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

これはコードビハインドである:

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

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

私はこの方法を使って上記のWPFウィンドウを開きます

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

しかし、System.Windows.Application.Currentを実行すると常にnullが返されます。

答えて

0

私はwin32 APIのFindWindowを使用して、ダイアログボックスのキャプションまたはタイトルを使用して閉じられるダイアログボックスのポインタ参照を見つけます。次に、win32のSendMessageを使用して、以前に見つかったポインタ参照を使用して正しいダイアログボックスを閉じるようにします。

あなたのクラスのいずれかにこれらのコードを入れてください:

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

だから、同じように使用することができます。これまでのところ

YourClass.CloseWindowIfOpen("CaptionOfModalDialog"); 

、私は正常にこの操作を行うことができますクローズするダイアログボックスのキャプションを入力することにより行う。ダイアログボックスのクラス名も使用できるはずですが、これでは成功しませんでした。たとえば、私のダイアログボックスクラス名DlgCustomWindowは、名前空間:AddInProject.Classesにあります。 は、私が使用したときにモーダルダイアログを見つけることができませんでした。​​またはFindWindow("AddInProject.Classes.DlgCustomWindow",name)

関連する問題