Vb.net 在模式ShowDialog()事件(VSTO)期间最小化传出Outlook邮件
我们继承了VSTO Outlook加载项的一些代码,该加载项在发送电子邮件之前会弹出一个类似于确认最终用户的模式对话框 该对话框在应用程序\u ItemSend事件时启动Vb.net 在模式ShowDialog()事件(VSTO)期间最小化传出Outlook邮件,vb.net,modal-dialog,vsto,outlook-addin,Vb.net,Modal Dialog,Vsto,Outlook Addin,我们继承了VSTO Outlook加载项的一些代码,该加载项在发送电子邮件之前会弹出一个类似于确认最终用户的模式对话框 该对话框在应用程序\u ItemSend事件时启动 Private Sub Application_ItemSend(ByVal Item As Object, ByRef Cancel As Boolean) Handles Application.ItemSend 我们看到的问题是,当我们显示对话框时: objCheckDialog.ShowDialog() 当弹出不需
Private Sub Application_ItemSend(ByVal Item As Object, ByRef Cancel As Boolean) Handles Application.ItemSend
我们看到的问题是,当我们显示对话框时:
objCheckDialog.ShowDialog()
当弹出不需要的对话框并且使用.Show()也不需要时,将最小化传出电子邮件窗口
在我们的研究过程中,我们发现了一些问题,建议调查对话对象的父属性,但是我们没有发现任何可用的父属性可以让我们最大化父属性:
另一个建议是向ShowDialog()传递对加载项的引用,以指定对话框的所有者,即:
objCheckDialog.ShowDialog(Me)
由于该属性也不存在,但认为这可能会填充父级:
但是,这会引发以下异常:
{"Unable to cast object of type 'XYZ.ThisAddIn' to type 'System.Windows.Forms.IWin32Window'."}
知道我们做错了什么吗
谢谢。您需要使用
NativeWindow
类
objCheckDialog.ShowInTaskbar = false;
IntPtr wnd = ParentWindow();
if (wnd != IntPtr.Zero)
{
NativeWindow nativeWindow = new NativeWindow();
nativeWindow.AssignHandle(wnd);
return objCheckDialog.ShowDialog(nativeWindow);
}
else
{
return form.ShowDialog();
}
可以使用IOleWindow
界面从Explorer
或Inspector
对象检索父窗口句柄:
[ComImport]
[Guid("00000114-0000-0000-C000-000000000046")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IOleWindow
{
void GetWindow(out IntPtr phwnd);
void ContextSensitiveHelp([In, MarshalAs(UnmanagedType.Bool)] bool fEnterMode);
}
public IntPtr ParentWindow()
{
IntPtr wnd = new IntPtr(0);
object window = _application.ActiveWindow();
if (window != null)
{
IOleWindow oleWindow = window as IOleWindow;
if (oleWindow != null)
{
oleWindow.GetWindow(out wnd);
}
}
return wnd;
}
如何将接口装饰程序转换为vb.net?Reference System.Runtime.InteropServices