2009-05-01 13 views
2

Gibt es eine Möglichkeit, ein Fenster inaktiv zu halten, selbst wenn es den Fokus enthält? Ich habe zwei Formen (A und B). Nachdem der Benutzer mit A interagiert hat, übertrage ich den Fokus zurück auf B. Das Ergebnis der Fokusübertragungen (der Benutzer klickt auf das A und der Fokus zurück zu B) ist, dass Form A von aktiv zu inaktiv blinkt. Das sieht hässlich aus (besonders auf Vista, wo A momentan einen größeren Schatten bekommt). Wie kann ich A inaktiv bleiben lassen, damit dieses Blinzeln nicht passiert?Fenster inaktiv bleiben, selbst wenn aktiviert

Antwort

11

Endlich fand ich die Antwort!

WARNUNG: NICHT die Technik dieser Antwort missbrauchen. Dies wird Ihre Benutzer verwirren und das Computererlebnis im Allgemeinen beeinträchtigen. Die unten beschriebene Technik kann unter bestimmten Umständen sehr nützlich sein (z. B. Implementieren von IntelliSense-ähnlichem Verhalten), aber bitte sollten Sie bei Ihrer Verwendung vernünftig sein.

Die Nachricht WM_NCACTIVATE wird an ein Fenster gesendet, um den Status des Nicht-Client-Bereichs (d. H. Rahmen und Titelleiste) in inaktiv oder aktiv zu ändern. Der wParam der Nachricht zeigt an, ob der Status inaktiv oder aktiv ist. Wenn das wParam wahr ist (ein Wert von 1), wird das Fenster aktiv angezeigt. Wenn wParam falsch ist (ein Wert von 0), wird das Fenster inaktiv angezeigt. Um zu erzwingen, dass ein Fenster entweder inaktiv oder aktiv bleibt, überschreiben Sie das wParam, indem Sie es auf den entsprechenden Wert (0 oder 1) setzen, und Sie sind fertig!

private const int WM_NCACTIVATE = 0x0086; 

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == WM_NCACTIVATE) 
    { 
     // Use this to make it always look inactive: 
     m.WParam = (IntPtr)0; 

     // Alternately, use this to make it always look active: 
     m.WParam = (IntPtr)1; 
    } 

    base.WndProc(ref m); 
} 
0

Sie sprechen über das Ändern eines Standardverhaltens eines GUI-Modells. Ich würde es nicht empfehlen. Wenn der Benutzer etwas auf A macht, sollte das Zurückkehren zu B nicht verschwinden. Warum blinkt es? Es sollte ein einzelner Schalter sein, wenn die Fokusänderung stattfindet.

konnte nicht sagen, was Sie beschreiben, ist der Fokus Schalt wie:

A-> B
B-> A> Benutzer Klick-> B
B-> A

?

+0

Ich versuche, VisualStudio's Intellisense zu imitieren. A ist das Vorschlagsfenster und B ist der Ort, an dem der Benutzer Text eingibt. Nachdem der Benutzer auf "A" (Ändern des ausgewählten Vorschlags usw.) geklickt hat, stelle ich den Fokus automatisch auf B zurück, damit der Benutzer weiter tippen kann, ohne den Fokus manuell zurücksetzen zu müssen. Die Fokusübertragung ist wie folgt: der Fokus ist auf B gesetzt, der Benutzer klickt auf A, bei der Maus nach oben setzt ich den Fokus zurück auf B. Ein Moment wird fokussiert, was zu einem blinkenden (oder flackernden) Fokus führt, den ich stoppen möchte . –

0

Nicht sicher, ob dies hilft, aber Winforms unterstützt das Konzept der eigenen Formulare. Zum Beispiel, obwohl schwebende Symbolleisten außerhalb eines Top-Level-Fensters leben, bleiben sie aktiv, selbst wenn das Top-Level-Fenster aktiv ist (und umgekehrt). Ebenso möchten Sie, dass der Benutzer in der Lage ist, mit Ihrem Formular A zu interagieren, ohne Formular B zu deaktivieren.

Um dies zu erreichen, klingt es so, als müssten Sie b.AddOwnedForm(a) anrufen, kurz bevor Sie a anzeigen.

+0

Ich habe Ihren Vorschlag ausprobiert, aber der Fokuswechsel zwischen dem Eigen- und dem Elternfenster verändert das Aussehen der Fenster leider immer noch von inaktiv zu aktiv. –

Verwandte Themen