IE BHO에서 열 때 대화 상자가 모달이되도록하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/126925

  •  02-07-2019
  •  | 
  •  

문제

인터넷 익스플로러 브라우저 헬퍼 객체 (BHO)가 C#로 작성되었으며 다양한 장소에서 모달 대화 상자로 양식을 열었습니다. 때때로 이것은 효과가 있지만 어떤 경우에는 그렇지 않습니다. 내가 현재 복제 할 수있는 경우 IE가 다른 어린이 창을 열기 위해 JavaScript를 실행하는 곳입니다 ... 어딘가에 약간 혼란스러워하고있는 것 같습니다 ....

문제는 내가 전화 할 때 :

(new MyForm(someParam)).ShowDialog();

양식은 모달이 아니므로 IE 창을 클릭하면 집중할 수 있습니다. IE는 내 코드를 실행하는 중이기 때문에 새로 고침되지 않으므로 사용자에게 IE가 매달려있는 것으로 보입니다.

양식이 모달로 열리도록하는 방법이 있습니까? 즉, IE Windows 뒤에 양식이 숨겨 질 수는 없습니다.

(IE7을 사용하고 있습니다.)

NB : 이것은 비슷한 질문입니다 이 게시물 그것은 Java를 사용하고 있지만. 솔루션이 IE 창의 IWIN32window에서 올바르게 통과 된 것 같아요.

도움이 되었습니까?

해결책 2

내 자신의 질문에 대답하려는 의도는 아니었지만 ...

올바른 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;
}

감사합니다 라이언 Windowwrapper 클래스의 경우,이를 수행 할 수있는 내장 방법이 있기를 바랐습니까?

업데이트 : 보호 모드는 IE8에서 작동하지 않습니다. 대신 현재 탭 (또는 다른 솔루션)의 HWND를 사용해야합니다. 예를 들어 .NET 예제를 참조하십시오. 이 게시물 그것을 얻는 방법을 위해.

다른 팁

다음은 Ryan/Rory의 Windowwrapper 코드의 더 간결한 버전입니다.

internal class WindowWrapper : IWin32Window
{
    public IntPtr Handle { get; private set; }
    public WindowWrapper(IntPtr hwnd) { Handle = hwnd; }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top