Ich arbeite an einer C#.Net-Anwendung, die einen etwas lästigen Fehler hat. Das Hauptfenster hat eine Reihe von Registerkarten, von denen jede ein Gitter hat. Beim Wechsel von einer Registerkarte zu einem anderen, oder die Auswahl einer anderen Zeile in einem Raster, tut es einige Hintergrundverarbeitung, und während dieser das Menü flackert, wie es neu gezeichnet wird (Datei, Hilfe, etc. Menüpunkte sowie Fenstersymbol und Titel).
Ich habe zunächst versucht, das Neuzeichnen des Fensters beim Umschalten von Registerkarten/Zeilen zu deaktivieren (WM_SETREDRAW-Meldung). In einem Fall funktioniert es perfekt. Im anderen Fall löst es den unmittelbaren Fehler (Titel-/Menüflimmern), aber zwischen dem Deaktivieren des Neuzeichnens und dem erneuten Aktivieren ist das Fenster für Mausklicks "transparent" - es gibt ein kleines Fenster (<1 Sek.), in dem ich klicken kann, und es wird z. B. ein Symbol auf meinem Desktop hervorgehoben, als ob die Anwendung überhaupt nicht vorhanden wäre. Wenn ich etwas anderes im Hintergrund laufen habe (z. B. Firefox), erhält es tatsächlich den Fokus, wenn ich darauf klicke (und zeichnet einen Teil des Browsers, z. B. die Adressleiste).
Hier ist der von mir hinzugefügte Code.
m = new Message();
m.HWnd = System.Windows.Forms.Application.OpenForms[0].Handle; //top level
m.WParam = (IntPtr)0; //disable redraw
m.LParam = (IntPtr)0; //unused
m.Msg = 11; //wm_setredraw
WndProc(ref m);
<snip> - Die Anwendung ignoriert Klicks in diesem Abschnitt (in einem Fall)
m = new Message();
m.HWnd = System.Windows.Forms.Application.OpenForms[0].Handle; //top level
m.WParam = (IntPtr)1; //enable
m.LParam = (IntPtr)0; //unused
m.Msg = 11; //wm_setredraw
WndProc(ref m);
System.Windows.Forms.Application.OpenForms[0].Refresh();
Weiß jemand, ob a) es eine Möglichkeit gibt, das Problem der transparenten Anwendung hier zu beheben, oder b) ob ich es in erster Linie falsch mache und dies auf eine andere Weise behoben werden sollte?