Come posso assicurarmi che una finestra di dialogo sia modale quando aperta da un IE BHO?

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

  •  02-07-2019
  •  | 
  •  

Domanda

Ho un Browser Helper Object (BHO) di Internet Explorer, scritto in c #, e in vari punti apro i moduli come dialoghi modali. A volte funziona, ma in alcuni casi no. Il caso che posso replicare al momento è dove IE esegue javascript per aprire altre finestre secondarie ... Immagino che stia diventando un po 'confuso da qualche parte ....

Il problema è che quando chiamo:

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

il modulo non è modale, quindi posso fare clic sulla finestra di IE e diventa attivo. Dato che IE è nel mezzo dell'esecuzione del mio codice, non si aggiorna e quindi per l'utente sembra che IE sia bloccato.

Esiste un modo per garantire che il modulo venga aperto come modale, ovvero che non sia possibile nascondere il modulo dietro le finestre di IE.

(Sto usando IE7.)

NB: questa è una domanda simile a questo post sebbene utilizzi java. Immagino che la soluzione stia funzionando correttamente nella finestra IWin32 della finestra di IE, quindi sto esaminando quello.

È stato utile?

Soluzione 2

Non era mia intenzione rispondere alla mia domanda, ma ...

Sembra che se si passa la corretta IWin32Window al metodo ShowDialog () funziona bene. Il trucco è come ottenerlo. Ecco come l'ho fatto, dove "siteObject" è l'oggetto passato al metodo SetSite () del 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;
}

Grazie a Ryan per la classe WindowWrapper, sebbene Speravo ci fosse un modo integrato per farlo?

AGGIORNAMENTO: questo non funzionerà su IE8 con modalità protetta, poiché accede a un HWND al di fuori di quello che dovrebbe essere. Dovrai invece utilizzare l'HWND della scheda corrente (o qualche altra soluzione?), Ad es. vedi esempio .net in questo post per ottenere questo.

Altri suggerimenti

Ecco una versione più concisa del codice WindowWrapper di Ryan / Rory:

internal class WindowWrapper : IWin32Window
{
    public IntPtr Handle { get; private set; }
    public WindowWrapper(IntPtr hwnd) { Handle = hwnd; }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top