[英]How can I ensure a dialog will be modal when opened from an IE BHO?
我有一個用c#編寫的Internet Explorer瀏覽器幫助器對象(BHO),在不同的地方,我都將窗體作為模式對話框打開。 有時這可行,但在某些情況下卻無效。 我目前可以復制的情況是IE正在運行javascript來打開其他子窗口...我猜它在某處變得有些困惑....
問題是當我打電話時:
(new MyForm(someParam)).ShowDialog();
表單不是模態的,所以我可以單擊IE窗口,它會成為焦點。 由於IE正在運行我的代碼,因此它不會刷新,因此對於用戶來說IE似乎正在掛起。
有沒有一種方法可以確保將窗體作為模式打開,即該窗體無法隱藏在IE窗口后面。
(我正在使用IE7。)
注意:盡管使用的是Java,但這是與此帖子類似的問題。 我猜想解決方案是正確地在IE窗口的IWin32Window中傳遞,所以我正在研究。
這是Ryan / Rory的WindowWrapper代碼的更簡潔版本:
internal class WindowWrapper : IWin32Window
{
public IntPtr Handle { get; private set; }
public WindowWrapper(IntPtr hwnd) { Handle = hwnd; }
}
我不是想回答我自己的問題,而是...
看來,如果將正確的IWin32Window傳遞給ShowDialog()方法,它將可以正常工作。 訣竅是如何獲得此。 這是我的操作方式,其中“ siteObject”是傳遞給BHO的SetSite()方法的對象:
IWebBrowser2 browser = siteObject as IWebBrowser2;
if (browser != null) hwnd = new IntPtr(browser.HWND);
(new MyForm(someParam)).ShowDialog(new WindowWrapper(hwnd));
...
// Wrapper class so that we can return an IWin32Window given a hwnd
public class WindowWrapper : System.Windows.Forms.IWin32Window
{
public WindowWrapper(IntPtr handle)
{
_hwnd = handle;
}
public IntPtr Handle
{
get { return _hwnd; }
}
private IntPtr _hwnd;
}
感謝Ryan的WindowWrapper類,盡管我希望有一種內置的方法來執行此操作?
更新:這在帶有保護模式的IE8上不起作用,因為它正在訪問HWND,而不是它應該訪問的范圍。 相反,你將不得不使用當前選項卡的HWND(或一些其他的解決方案?),例如參見.NET示例這篇文章的得到那個的一種方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.