2008-09-24 8 views
1

J'ai un objet d'aide au navigateur Internet Explorer (BHO), écrit en C#, et à divers endroits, j'ouvre des formulaires comme boîtes de dialogue modales. Parfois, cela fonctionne mais dans certains cas ce n'est pas le cas. Le cas que je peux reproduire à l'heure actuelle est en cours d'exécution où le javascript est IE pour ouvrir d'autres fenêtres enfants ... Je suppose que ça devient un peu confus quelque part ....Comment puis-je m'assurer qu'un dialogue sera modal lorsqu'il est ouvert à partir d'un IE BHO?

Le problème est que quand je l'appelle:

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

le formulaire n'est pas modal, donc je peux cliquer sur la fenêtre IE et il obtient le focus. Comme IE est en cours d'exécution de mon code, il ne rafraîchit pas et donc à l'utilisateur il semble que IE est suspendu. Y at-il un moyen de s'assurer que le formulaire sera ouvert comme modal, c'est-à-dire qu'il n'est pas possible que le formulaire soit caché derrière les fenêtres IE.

(je IE7.)

NB: il est une question similaire à this post bien que ce soit en utilisant java. Je suppose que la solution circule correctement dans IWin32Window de la fenêtre IE, donc j'étudie cela.

Répondre

1

Il n'a pas été mon intention de répondre à ma propre question, mais ...

Il semble que si vous passez dans le IWin32Window correct à la méthode ShowDialog() il fonctionne très bien. L'astuce est de savoir comment l'obtenir. Voici comment je l'ai fait, où « siteObject » est l'objet passé dans 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 je l'avais espéré qu'il y avait un intégré de manière à le faire? MISE À JOUR: cela ne fonctionnera pas sur IE8 avec le 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 en cours (ou une autre solution?), Par ex. Voir. Net exemple dans this post pour un moyen d'obtenir cela.

2

Voici une version plus concise code Ryan/WindowWrapper Rory:

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