문제

사용할 때 System.Windows.Forms.ShowDialog(IWin32Window), 내가 통과 할 수 있어야한다 IWin32Window 창 핸들을 나타내고 해당 창에 대해 모달이 있습니까?

Internet Explorer 7 Extension의 일환으로 인터넷 익스플로러 탭과 관련하여 창 모달을 열려고합니다. 현재 선택된 탭은 아니지만 탭의 HWND를 얻을 수 있습니다. 그러나 이것을 전시 할 때 내 양식이 표시되지만, 어떤 것에 대한 모달이 아닙니다. 나는 여전히 소유자가되어야하는 탭을 포함하여 인터넷 익스플로러에서 일을 할 수 있습니다. 내 양식은 Internet Explorer Windows 위에 떠 다니고 상단에 머무르기 때문에 정상적인 형태로 열리지는 않지만 올바르게 모달이 아닙니다.

사용 스파이 ++, 내 양식을 찾을 수 있으며 소유자 핸들이 올바르게 설정되어 있습니다.

이것은 무언가 잘못되었거나 내가 뭔가 잘못하고 있다는 것을 의미합니까? 내 양식을 올바르게 모달로 만드는 방법은 무엇입니까?

참고로, 나는이 래퍼 클래스를 사용하여 IWin32Window a hwnd (감사해요 라이언!):

/// <summary>
/// Wrapper class so that we can return an IWin32Window given a hwnd
/// </summary>
public class WindowWrapper : System.Windows.Forms.IWin32Window
{
    public WindowWrapper(IntPtr handle)
    {
        _hwnd = handle;
    }

    public IntPtr Handle
    {
        get { return _hwnd; }
    }

    private IntPtr _hwnd;
}

업데이트 : Internet Explorer 7 & .NET 2.0 사용

업데이트 : 스파이 ++와 함께 더 많이 연주하고 핸들이 노출되면 다른 것을 사용하면 다른 것을 사용한다는 것을 알게됩니다. hwnd 그런 다음 탭에 내 창을 모달로 만들 수 있습니다.

나는 탭을 사용하고 있었다 hwnd as suggested by the iwebbrowser2.hwnd doc, 스파이 ++에서 클래스로 나타납니다 TabWindowClass. 수업의 자녀가 있습니다 Shell DocObject View, Internet_Explorer_Server의 자녀가 있습니다. 내가 사용하는 경우 hwndInternet Explorer_Server 예를 들어 다른 탭의 마우스를 클릭하면 인터넷 익스플로러가 정상적으로 반응합니다. 관심있는 탭에서 마우스를 클릭하면 Windows d 'Oh Sound를 재생하고 아무것도하지 않습니다.

인터넷을 프로그래밍적으로 얻는 방법을 아직 모르겠습니다. hwnd, 그러나 가능해야합니다.

또한 다른 창 핸들을 사용하면서 가치가있는 것을 위해 나는 일반적으로 다른 응용 프로그램과 대화 상자에 대한 양식을 만들 수있었습니다. 그래서 내 질문에 대한 답은 '많은 손잡이는 아니지만 모든 손잡이'라고 생각합니다 ... 아마도 응용 프로그램에 달려 있습니까?

업데이트 : 또 다른 측면 노트 : 창 전체 대신 탭에 양식을 만들고 싶은 원래 이유는 MessageBox 내 양식에서 양식을 소유자로 전달합니다. MessageBox 내 양식 위에 항상 열리지는 않을 것입니다. 새로운 인터넷 익스플로러 탭이 방금 열렸지만 활성화되지 않은 경우 MessageBox 숨겨져 있고 그 탭이 깜박이기 시작합니다. 그러나 내 양식이 개방 된 모달로 Internet Explorer가 비활성화되었으므로 해당 탭으로 전환 할 수 없었으므로 Internet Explorer는 동결됩니다. 나는 양식 모달을 탭에 열 수 있다고 생각했지만 다른 해결책이 사용하지 않는 것입니다. MessageBox: 두 번째 양식을 사용하는 경우 ShowDialog(this) 내 첫 번째 양식에서 두 번째 양식이 정면으로 올바르게 열립니다. 그래서 그것은 것 같습니다 Form.ShowDialog() 보다 잘 작동합니다 MessageBox.Show() 일부 경우에. 더 많은 토론 모달 대화 상자 및 메시지 상자 문제.

도움이 되었습니까?

해결책

코드가 정확합니다. IE가 탭과 관련된 스레딩 모델이 있다는 것입니다. 정확한 세부 사항을 모르지만 짧은 버전은 각 탭이 다른 탭과 다른 스레드에서 실행될 수 있고 가능성이 높다는 것입니다.

대화 상자의 모달은 대화 상자가 실행중인 스레드에만 해당됩니다. 다른 스레드의 UI는 다른 스레드의 모델 대화에 영향을받지 않습니다. 이러한 이유로 다른 스레드에서 실행중인 탭에 액세스 할 수 있습니다.

다른 팁

showdialog ()는 두 가지 중요한 일을합니다. 메시지 루프를 펌핑하기 시작하여 호출 코드에 모드로 작동합니다. 또한 enablewindow (False) API 호출로 응용 프로그램의 다른 Windows를 비활성화합니다. 후자는 당신의 경우에는 일어나지 않는 것입니다. 비활성화 해야하는 창이 WF 창이 아니라는 점을 고려할 때 완전히 놀라운 것은 아닙니다.

enablewindow ()를 직접 호출해야 할 수도 있습니다. 대화 상자가 닫히기 전에 다시 활성화해야합니다.

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

internal class WindowWrapper : IWin32Window
{
    public IntPtr Handle { get; private set; }
    public WindowWrapper(IntPtr hwnd) { Handle = hwnd; }
}

IE 확장에서 이것을 시도한 적이 없지만 IE는 win32 스타일 모달 창을 "존중"하지 않을 수있는 직감이 있습니다. window.open().

다른 응용 프로그램에 필요한 방식으로 작동하는지 확인하기 위해 IE 이외의 다른 것에 대해이 코드를 테스트 했습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top