Como posso garantir uma caixa de diálogo será modal quando aberto a partir de uma IE BHO?

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

  •  02-07-2019
  •  | 
  •  

Pergunta

Eu tenho um objeto Internet Explorer Browser Helper (BHO), escrito em C #, e em vários lugares I formas abertas como diálogos modais. Às vezes isso funciona, mas em alguns casos isso não acontece. O caso que eu possa replicar no momento é onde IE está a executar JavaScript para abrir outras janelas filho ... Eu acho que ele está ficando um pouco confuso em algum lugar ....

O problema é que quando eu chamo:

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

o formulário não é modal, para que eu possa clicar na janela do IE e torna-se o foco. Desde IE está no meio de executar o meu código não atualizar e, portanto, para o usuário parece que o IE é pendurado.

Existe uma maneira de garantir que o formulário será aberto como modal, ou seja, que não é possível para o formulário a ser escondido atrás de janelas do IE.

(estou usando IE7).

Nota: esta é uma pergunta semelhante a este pós apesar de que está usando java. Eu acho que a solução é em torno corretamente passando o IWin32Window da janela do IE, então eu estou olhando para isso.

Foi útil?

Solução 2

Não foi minha intenção de responder a minha pergunta, mas ...

Parece que se você passar no IWin32Window correta para o método ShowDialog () funciona bem. O truque é como conseguir isso. Aqui está como eu fiz isso, onde 'siteObject' é o objeto passado para o método SetSite () do BHO:

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;
}

Graças à Ryan para a classe WindowWrapper, embora Eu esperava que houvesse um built-in maneira de fazer isso?

UPDATE: isto não vai funcionar no IE8 com o Modo Protegido, uma vez que está acessando um fora HWND o que deveria ser. Em vez disso você terá que usar o HWND da guia atual (ou alguma outra solução?), Por exemplo, veja .net exemplo na este postar uma maneira de conseguir isso.

Outras dicas

Aqui está uma versão mais concisa do código WindowWrapper de Ryan / Rory:

internal class WindowWrapper : IWin32Window
{
    public IntPtr Handle { get; private set; }
    public WindowWrapper(IntPtr hwnd) { Handle = hwnd; }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top