2011-08-12 2 views
3

En bref, je veux créer un fond qui occupe tout l'écran et reste toujours à l'arrière - sans définir aucun des autres formulaires de demande qui apparaissent pour être mis à son enfant quand ils sont créés.WinForms - Essayer de faire un fond agrandi qui reste en arrière-plan et ne répond pas

J'ai une application WinForms que je gère de temps en temps et qui nécessite beaucoup d'améliorations architecturales. C'est une application de kiosque à écran tactile. Cela va attirer beaucoup d'attention à l'avenir, mais pour l'instant, je dois y mettre un pansement.

Problème est que l'application a été conçue avec des fenêtres qui vont et viennent et il n'y a pas de fenêtres principales dont les autres fenêtres sont des enfants. Et tout est multi-threadé car il répond à de nombreux événements provenant de différentes sources. De plus, tout est confusément Castle-Windsor-ized et cela rend tous les changements problématiques et la multiplication des défauts.

Ainsi, certains des "dialogues" qui apparaissent ne sont pas en mode dialogue et n'ont pas de parents et ne prennent pas le plein écran comme ils le devraient. Et je suppose que cela n'a pas été pris en compte dans le test, car parfois les fenêtres précédentes restaient en place et parfois, elles ne le faisaient pas en raison de certains bogues dans la gestion des événements. Il y a beaucoup de bugs latents et de défauts de conception dans le système, donc les choses se cassent quand je le perturbe trop. Cela signifie que parfois le bureau devient visible (par exemple, à la limite d'une boîte de dialogue qui n'est pas définie en mode plein écran, lorsqu'un ancien formulaire est supprimé), ce qui signifie que les opérateurs peuvent se connecter à Internet. surf porn ou quoi que ce soit.

J'ai créé un formulaire qui fonctionne et j'ai défini un gestionnaire d'événements sur la plupart des événements pertinents (qui appelle simplement SendToBack()) s'ils se produisent - comme un focus ou un clic de souris ou autre.

Je crains que cela n'attrape pas tout et les utilisateurs verront cette forme grise vierge et ne feront rien (s'ils cliquaient dessus, ils iraient à l'arrière).

Existe-t-il un moyen garanti de forcer ce formulaire à rester en arrière-plan?

Répondre

4
public partial class BackgroundForm : Form 
{ 

    const int WM_MOUSEACTIVATE = 0x21; 
    const int MA_NOACTIVATEANDEAT = 0x0004; 

    public BackgroundForm() 
    { 
     InitializeComponent(); 
     ShowInTaskbar = false; 
    } 

    protected override void DefWndProc(ref Message m) 
    { 
     if (m.Msg == WM_MOUSEACTIVATE) 
     { 
      m.Result = (IntPtr) MA_NOACTIVATEANDEAT; 
      return; 
     } 

     base.DefWndProc(ref m); 
    } 

    protected override bool ShowWithoutActivation 
    { 
     get { return true; } 
    } 

} 
+0

Cela semble fonctionner un peu mieux que ma technique de capture de tous les événements. Avec mon clavier, je suis capable de l'Alt-Tab vers l'avant et à ce moment-là, je dois garder Alt-Tabbing pour m'en débarrasser. Donc, même s'il ne peut pas être activé avec la souris, il peut toujours être activé. Je vais chercher à l'empêcher d'être dans la liste Alt-Tab. –

+0

@Cade Vous pouvez également réagir à d'autres événements http://msdn.microsoft.com/fr-fr/library/ff468922(v=VS.85).aspx - Je vais regarder ce que je peux faire – Skomski

+0

Ajout de 'FormBorderStyle = FormBorderStyle .SizableToolWindow; 'l'a enlevé de Alt-Tab. –