Comment puis-je m'assurer qu'un dialogue sera modal lorsqu'il est ouvert à partir d'un IE BHO?

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

  •  02-07-2019
  •  | 
  •  

Question

J'ai un objet d'assistance au navigateur Internet Explorer (BHO), écrit en c # et, à divers endroits, j'ouvre des formulaires en tant que boîtes de dialogue modales. Parfois, cela fonctionne mais dans certains cas, cela ne fonctionne pas. Le cas que je peux reproduire à présent est où IE utilise javascript pour ouvrir d'autres fenêtres enfants ... Je suppose que ça devient un peu confus quelque part ...

Le problème est que lorsque j'appelle:

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

le formulaire n’est pas modal, je peux donc cliquer sur la fenêtre IE pour obtenir le focus. Comme IE est en train d'exécuter mon code, il n'est pas actualisé. Par conséquent, pour l'utilisateur, il semble que IE est en attente.

Existe-t-il un moyen de s’assurer que le formulaire est ouvert en mode modal, c’est-à-dire qu’il est impossible que le formulaire soit masqué derrière les fenêtres IE.

(J'utilise IE7.)

NB: cette question est similaire à cet article bien que cela utilise Java. Je suppose que la solution consiste à passer correctement dans la fenêtre IWin32Window de la fenêtre IE, je suis donc en train d’examiner cette question.

Était-ce utile?

La solution 2

Je n'avais pas l'intention de répondre à ma propre question, mais ...

Il semble que si vous transmettez la méthode IWin32Window correcte à la méthode ShowDialog (), cela fonctionne correctement. Le truc, c'est comment l'obtenir. Voici comment je l'ai fait, où "siteObject" est l'objet transmis à la méthode SetSite () du 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;
}

Merci à Ryan pour la classe WindowWrapper, bien que J'espérais qu'il y avait un moyen intégré de le faire?

UPDATE: cela ne fonctionnera pas avec IE8 en mode protégé, car il accède à un HWND en dehors de ce qu'il devrait être. Au lieu de cela, vous devrez utiliser le HWND de l'onglet actuel (ou une autre solution?), Par exemple. voir l'exemple .net dans cela poste pour obtenir ce résultat.

Autres conseils

Voici une version plus concise du code WindowWrapper de Ryan / Rory:

internal class WindowWrapper : IWin32Window
{
    public IntPtr Handle { get; private set; }
    public WindowWrapper(IntPtr hwnd) { Handle = hwnd; }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top