2010-09-17 10 views
3

J'ai un problème avec un MessageBox destiné à être modal.Problème avec MessageBox

Voici la situation,

  • Un utilisateur select xx du formulaire
  • MessageBox apparaît
  • utilisateur ouvre le clavier logiciel embebed (intégré dans l'un, du dispositif)
  • L'utilisateur ferme le clavier
  • Le MessageBox perd le focus (comment?) Il est supposé être modal!) Et le formulaire principal est affiché au premier plan
  • L'application bloque, car l'utilisateur ne peut plus fermer le MessageBox.

Voici l'extrait de code pour MessageBox.

MessageBox.Show("message", "caption", MessageBoxButtons.OK, MessageBoxIcon.Asterisk, 
            MessageBoxDefaultButton.Button1); 

Des idées pour résoudre ce problème?

+0

Y a-t-il d'autres facteurs intéressants? Il semble que ce que vous avez devrait "juste fonctionner". Que se passe-t-il si vous créez un nouveau formulaire et que vous faites 'ShowModal()' sur ce nouveau formulaire, voyez-vous le même comportement? – Nate

Répondre

0

Vous devez inclure une référence au formulaire parent lors de l'appel du MessageBox.Show (le paramètre IWin32Window, généralement transmis dans "this"). Je crois que c'est la surcharge que vous souhaitez utiliser - voir ci-dessous:

MessageBox.Show Method (IWin32Window, String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton) 

Here is a link to the Microsoft documentation.

Enjoy!

+0

cadre malheureusement compact ne supporte pas cela – MerickOWA

+2

Non - les FC ne supporte pas cela, et même si cela ne le réglerait pas le problème (voir ma réponse) – ctacke

1

C'est en fait un comportement quelque peu attendu sous Windows CE (je ne dis pas que c'est juste, juste prévu).

Lorsque vous cliquez sur le bouton SIP dans le coin du bureau, l'application entière perd le focus et la mise au point est transmise à la barre des tâches. Vous pouvez voir le même "wierdness" en cliquant sur le bouton de barre des tâches de votre application - le MessageBox perdra le focus, même si par tous les droits, vous devriez juste envoyer le focus à l'application qui est déjà en cours d'exécution.

Vous pouvez voir que ce n'est pas un bug de FC en changeant votre appel MessageBox comme ceci:

private void button1_Click(object sender, EventArgs e) 
{ 
    //MessageBox.Show("message", "caption", MessageBoxButtons.OK, 
    //         MessageBoxIcon.Asterisk, 
    //         MessageBoxDefaultButton.Button1); 

    MessageBoxCE(this.Handle, "message", "caption", 0); 
} 

// renamed to not collide with the Windows.Forms MessageBox class 
[DllImport("coredll", EntryPoint="MessageBox")] 
private static extern int MessageBoxCE(IntPtr hWnd, string lpText, 
             string lpCaption, int Type); 

Et vous obtenez exactement le même comportement.

La seule chose qui est pas attendue est que le formulaire parent arrive au-dessus du MessageBox. Je viens de tester sur un appareil CE 5.0 basé sur ARM que j'ai sur mon bureau et le MessageBox reste au top dans les versions CF et P/Invoke.

Êtes-vous capable de reproduire ce comportement avec une application très basique (à savoir un formulaire, un bouton)? Si oui, cela ressemble à un problème de plateforme. Une chose à retenir à propos de l'utilisation de CE est que, puisque l'OEM a beaucoup de contrôle sur la façon dont le système d'exploitation est réellement mis en œuvre, vous ne pouvez jamais exclure un bug de plate-forme pour les comportements.

0
MessageBox.Show("Please insert Correct Username and Password.", "Login Error", 
       MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
this.Focus(); 

C'est une solution simple. pas besoin d'exécuter JavaScript ou un autre code C#.