2014-02-24 73 views
0

我目前正在研究一個小小的outlook-addin。我的插件打開一個對話框(System.Windows.Forms.Form)。如何在應用程序頂部保留一個對話框

我想保留對話框的頂部的前景,所以我嘗試了TopMost,但保持對話的頂部的所有應用程序。

當outlook是活動應用程序時,我希望對話框位於頂部,我該如何實現這一目標?

UPDATE

由於梅德kallocain我可以解決這個問題。我想簡要介紹一下我的所得溶液:

TabCalendarRibbon類我的Outlook插件我有激活我的對話框事件方法,我用從kallocain的代碼來獲取窗口句柄:

Explorer explorer = Context as Explorer; 
IntPtr explorerHandle = (IntPtr)0; 

if (explorer != null) 
{ 
    IOleWindow window = explorer as IOleWindow; 
    if (window != null) 
    { 
     window.GetWindow(out explorerHandle); 
    } 
} 

正如在kollacains答案中所述,我不得不添加OLE互操作程序集。我用資源管理器手柄顯示我的對話框:

var dlg = new NewEntryDialog(); 
dlg.Show(new WindowWrapper(explorerHandle)); 

正如你可能會注意到,我不能使用窗口直接辦理,但必須實現實現IWin32Window一個小包裝。爲此,我跟着我通過Dmitry鏈接到的上一個答案找到的描述。我簡單地複製了以下代碼:

public class WindowWrapper : System.Windows.Forms.IWin32Window 
{ 
    public WindowWrapper(IntPtr handle) 
    { 
     _hwnd = handle; 
    } 

    public IntPtr Handle 
    { 
     get { return _hwnd; } 
    } 

    private IntPtr _hwnd; 
} 

瞧,它的工作原理與我預期的非常相似。如果只要我在日曆功能區中,對話框只會處於活動狀態,那就更好了,但那是另一天的事情。順便說一句,結果,我想...

+0

可能重複http://stackoverflow.com/questions/2613494/how-to-make-form-topmost-to-the-application-only – Akrem

回答

2

正如Akrem指出,見How to make form topmost to the application only?。要獲取Outlook資源管理器對象的HWND(例如Application.ActiveExplorer),將其轉換爲IOleWindow並調用IOleWindow.GetWindow()。

+0

我會definitly只要我發現率這是答案瞭解如何獲得窗口句柄。我使用Outlook.Application對象來調用ActiveExplorer(),但我不能將結果投射到IOleWindow。界面未知。 – anhoppe

1

德米特里的答案是正確的。您只需添加對「Microsoft.VisualStudio.OLE.Interop.dll」的引用(可在C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ PrivateAssemblies中找到)。

Explorer explorer = control.Context as Explorer; 
if (explorer != null) 
{ 
    IOleWindow window = explorer as IOleWindow; 
    if (window != null) 
    { 
     IntPtr explorerHandle; 
     window.GetWindow(out explorerHandle); 
    } 
} 
+0

不錯。謝謝。 – anhoppe

相關問題