Pergunta

Ao usar System.Windows.Forms.ShowDialog(IWin32Window), eu deveria ser capaz de passar em uma IWin32Window representando qualquer identificador de janela e que ele seja modal em relação a essa janela?

Como parte de uma extensão Internet Explorer 7 Estou tentando abrir uma janela modal em relação a um guia Internet Explorer. Não é a guia selecionada no momento, mas posso obter o hwnd da guia OK. No entanto, quando eu passar isso para showDialog minha forma é mostrada, mas não é modal com relação a qualquer coisa: Eu ainda pode fazer coisas no Internet Explorer, incluindo na guia que é suposto ser o proprietário. Minha forma é mostrado flutuando acima das janelas do Internet Explorer e ele permanece no topo, então não é como se estivesse acabado de abrir como uma forma normal, mas não é corretamente modal.

Usando Spy ++ , posso encontrar minha forma e é pega proprietário está definido corretamente.

Isso significa que algo tem de errado embora, ou eu estou fazendo algo errado? Como posso fazer meu formulário corretamente modal?

FYI, eu estou usando esta classe wrapper para criar um IWin32Window de um hwnd (graças Ryan ):

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

UPDATE: Usando o Internet Explorer 7 e .NET 2.0

UPDATE: Jogando em torno de alguns mais com Spy ++ e as alças ele expõe, eu acho que se eu usar um hwnd diferente, então eu posso fazer minha janela modal para a guia:

Eu estava usando hwnd da guia como sugerido pelo IWebBrowser2.HWND doc, que em Spy ++ aparece como TabWindowClass classe. Ele tem um filho de Shell DocObject View classe, que tem um filho de Internet_Explorer_Server. Se eu usar o hwnd do Internet Explorer_Server em seguida, ele funciona corretamente, por exemplo, quando eu clique com o mouse em outras guias, Internet Explorer reage normalmente. Quando eu clique com o mouse sobre a aba de interesse, que desempenha as janelas d'oh som e não fazer nada.

Eu ainda não sabe como chegar programaticamente o hwnd Internet_Explorer_Server, mas deve ser possível.

Além disso, para o que vale a pena, enquanto brincava com outras alças janela eu era geralmente capaz de fazer a minha forma modal para outras aplicações e diálogos. Então eu acho que a resposta para a minha pergunta é 'muitos, mas nem todas as alças' ... possivelmente depende da aplicação?

UPDATE: Outra nota lateral: A razão original que eu queria fazer o meu formulário modal para a guia em vez de toda a janela é que ao abrir um MessageBox da minha forma, passando a forma como proprietário, o MessageBox não iria sempre aberta no topo da minha forma. Se uma nova aba Internet Explorer tinha acabado de ser aberta, mas não estava ativo, então o MessageBox seria escondido e que guia iria começar a piscar. No entanto, uma vez que o Internet Explorer foi desativado com a minha forma aberta modal não foi possível para mudar para esse guia, então Internet Explorer seria congelada. Eu pensei que a abertura de minha forma modal para a guia iria resolver isso, mas eu encontrei outra solução é evitar o uso MessageBox: se eu utilizar um segundo formulário e ShowDialog(this) de minha primeira forma, em seguida, o segundo formulário é aberto corretamente para a frente. Assim, parece que Form.ShowDialog() funciona melhor do que MessageBox.Show() em alguns casos. Mais discussão em problemas com diálogos modais e messageboxes .

Foi útil?

Solução

O código está correto. O problema é provável que correr para que é que o IE tem um modelo de segmentação relacionado aos seus guias. Eu não sei os detalhes exatos, mas a versão curta é que cada lata guia e, provavelmente, está sendo executado em um segmento diferente do que as outras abas.

O Modal'ness de um diálogo é específico para o segmento onde o diálogo está em execução. UI em outros tópicos não será afetada por um diálogo modelo em outro segmento. É inteiramente possível que você é capaz de guias de acesso que estão sendo executados em um segmento diferente por este motivo.

Outras dicas

ShowDialog () faz duas coisas importantes. Ele começa a bombear um loop de mensagem para que ele age de forma modal para o código de chamada. E ele desabilita todas as outras janelas no aplicativo com uma chamada API EnableWindow (false). O último é o que não está acontecendo no seu caso. Não inteiramente surpreendente, considerando que a janela que precisa ser desativado não é uma janela WF.

Você pode precisar chamar EnableWindow () você mesmo. Certifique-se de reativá-lo antes de a janela fecha ou Windows vai caçar para a janela de outro aplicativo para dar o foco para.

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

Eu nunca tentei isso a partir de uma extensão IE, mas eu tenho um palpite de que o IE não pode "respeitar" uma janela modal Win32-estilo da mesma maneira que faz uma janela modal levantada a partir de Javascript usando window.open().

Você testou este código contra algo que não seja IE, apenas para confirmar que funciona da maneira que deveria para outras aplicações?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top