代码之家  ›  专栏  ›  技术社区  ›  Howard Pinsley

我应该使用哪种技术在外接程序DLL中弹出一个简单窗体?

  •  0
  • Howard Pinsley  · 技术社区  · 15 年前

    我正在构建一个程序集,该程序集作为供应商Outlook外接程序的“加载项”运行。当我要执行我的“操作”时,我必须设置一个简单的窗口,其中包含一些简单的控件。供应商的外接程序为我提供父窗口的整数句柄。我可以很容易地用WinForms创建表单,方法是从我的程序集中添加对System.Windows.Forms的引用,并使用以下代码:

            FrmHistoryDisplay frm = new FrmHistoryDisplay();
            frm.ShowDialog(new ParentWindowWrapper(_parentWindowHandle));
    

            private class ParentWindowWrapper : IWin32Window {
    
            private int _parentWindowHandle;
    
            public ParentWindowWrapper(int parentWindowHandle) {
                _parentWindowHandle = parentWindowHandle;
            }
    
            public IntPtr Handle {
                get { return new IntPtr(_parentWindowHandle); }
            }
        }
    

    表单的ShowDialog方法采用IWin32Window实现程序来包装父级的窗口句柄。

    2 回复  |  直到 15 年前
        1
  •  2
  •   dthorpe    15 年前

    是的,您可以对WPF执行类似的操作,将WPF窗口作为任意Win32窗口句柄的所有者或父级宿主。给定WPF form方法上下文中的wHandle,可以执行以下操作:

    var helper = new WindowInteropHelper(this);
    helper.Owner = wHandle;
    
    this.Show();
    

    这将把WPF窗口设置为给定wHandle拥有的标准顶级窗口。Win32窗口句柄所有权对于模式对话框行为、窗口激活和单击已停用应用程序的任何窗口时的焦点等至关重要。

    对于Outlook外接程序,您应该使用WinForms还是WPF,这完全取决于您和您的偏好。我很确定Outlook的UI既不使用WinForms也不使用WPF,因此无论您做什么,都需要确保在安装外接程序时在计算机上安装了正确的库。

        2
  •  1
  •   Svisstack    15 年前

    我将使用以下方法进行注释:

    “把一个从很容易与 “WinForms”