我有一个VSTO Outlook插件,我想弹出一个通知(浮动窗口)与自定义文本消息特定时间(例如5秒),然后自动消失。我想在撰写窗口中显示此通知。我怎样才能做到这一点呢?请举个例子。
已更新:我希望通知窗口是撰写窗口的子窗口。
29.06.2022更新:我做了以下的事情:
Outlook.Inspector currentInspector = this.Window as Outlook.Inspector;
IOleWindow ioleWnd = (IOleWindow)currentInspector;
ioleWnd.GetWindow(out IntPtr phwnd);
NativeWindow nativeWnd = new System.Windows.Forms.NativeWindow();
nativeWnd.AssignHandle(phwnd);
// frm is my notification window, borderless and without maximize, minimize and close buttons and without title bar.
Form frm = new Form();
frm.ControlBox = false;
frm.FormBorderStyle = FormBorderStyle.None;
NativeMethods.Rect rect = new NativeMethods.Rect();
NativeMethods.GetWindowRect(phwnd, ref rect);
frm.Left = rect.Right - 85;
frm.Top = rect.Bottom - 55;
frm.Width = 80;
frm.Height = 50;
frm.Location = new System.Drawing.Point(rect.Right - 85, rect.Bottom - 55);
frm.BackColor = System.Drawing.Color.Red;
TextBox txtBox = new TextBox();
txtBox.BackColor = System.Drawing.Color.Red;
txtBox.ForeColor = System.Drawing.Color.White;
txtBox.Location = new System.Drawing.Point(5, 5);
txtBox.Visible = true;
txtBox.Text = "This is a notification message";
frm.Controls.Add(txtBox);
frm.Show(nativeWnd);
上面代码的结果如下:
- 通知窗口没有位于右下角
- 如果我移动撰写窗口,通知窗口保持在相同的位置,当我移动撰写窗口时它不会移动。
- 在windows任务栏中,它显示为通知窗口是一个不同的进程/程序,而不是同一撰写窗口的一部分,也许我需要做一些像从。Owner = nativewind,但不工作
任何想法?
使用定时器在主线程(UI)上触发Tick
事件,您可以在其中调用表单的Close
方法。当收到WM_TIMER
消息时,System.Windows.Forms.Timer
的事件由消息循环从UI线程引发。所以,你可以调用Close方法。
注意,计时器可以在表单外部或表单内部(内置到表单中)运行并关闭表单。
您可以创建一个自定义的Windows窗体,它会在超时后自动关闭。
要使窗体成为Outlook检查器的子窗体,Q/castInspector
对象(例如从Application.ActiveInspector
)到IOleWindow
接口,调用IOleWindow.GetWindow
来获得HWND
。创建System.Windows.Forms.NativeWindow
类的实例并调用NativeWindow.AssignHandle
。然后你可以将NativeWindow
对象传递给Form.Show
或Form.ShowModal
(NativeWindow
对象实现IWin32Window
接口)。