2 Stimmen

Wie kann ich alle Tastatur- und Mauseingaben in meiner WinForms-Anwendung blockieren?

Ich habe eine WinForms-Anwendung, die Daten von einem Webdienst auf einem Worker-Thread abruft, und ich brauche, um alle Eingaben in meine Anwendung zu deaktivieren, bis die Daten geladen sind.

Derzeit erstelle ich ein halbtransparentes Formular und lege es über meine Anwendung. Wenn der Datenaufruf abgeschlossen ist, schließe ich dieses Overlay-Formular. Das funktioniert gut, allerdings verursacht es erhebliche Leistungsprobleme für Benutzer, die die Anwendung über Terminaldienste ausführen. Ich habe versucht, das Overlay vollständig transparent zu machen, aber das löst immer noch zwei Neuaufrufe des gesamten Fensters aus, so dass dies überhaupt nicht geholfen hat.

Ich weiß, dass eine gemeinsame Empfehlung für die Behandlung dieser ist, alle Steuerelemente zu deaktivieren, aber das würde auch neu zeichnen viel des Bildschirms, so dass ich für eine andere Möglichkeit, alle Benutzereingaben zu blockieren suchen. Jede Hilfe wäre sehr willkommen!

UPDATE: Ich hätte erwähnen sollen, dass wir den modalen Dialog in Betracht gezogen haben. Derzeit zeigen wir das Overlay an, starten den Datenzugriffsthread und bauen dann das Formular auf. Wenn es keine bessere Möglichkeit gibt, Eingaben zu blockieren (App.BlockInput() wäre schön), dann könnten wir die Idee des modalen Dialogs verwenden, aber wir müssten warten, bis der Aufbau des Formulars abgeschlossen ist, und es gibt derzeit keine schöne, zentrale Stelle, um dies zu tun.

4voto

Nikolay R Punkte 957

Sie könnten ein kleines Modal anzeigen ( modalForm.ShowDialog(yourForm) ) Formular mit einem Fortschrittsbalken, der über Ihre Anwendung läuft. Dies wird nicht dazu führen, dass große Bereiche neu gezeichnet werden.

3voto

Daniel Pryden Punkte 56882

Wenn Ihre Anwendung wirklich blockiert wird, während der Vorgang läuft, würde ich tun, was Microsoft häufig tut: Öffnen Sie ein modales Dialogfeld mit einer Art von Throbber-Animation oder ProgressBar und einer Schaltfläche Abbrechen. Das erneute Zeichnen ist begrenzt, da Sie nur die Größe des neuen Dialogfelds zeichnen, und die Eingabe in den Rest Ihrer Anwendung ist blockiert, da das Dialogfeld modal ist. Außerdem sind die Benutzer viel eher bereit zu warten, wenn Sie eine Art von Statusaktualisierung oder Animation haben, weil es so aussieht, als würde der Computer "arbeiten".

Wenn es jedoch Vorgänge gibt, die der Benutzer ausführen kann, während die Webdienstanforderung läuft, ist es besser, die Steuerelemente zugänglich zu lassen. Zumindest sollte es immer eine Möglichkeit geben, den Prozess zu unterbrechen/abzubrechen.

Update : Da Sie nun die Frage geändert haben: Wie lange dauert es, den modalen Dialog zu erstellen? Warum bauen Sie den Dialog nicht einfach leer auf und füllen dann die Steuerelemente aus? Wenn Sie nur ein kleines Dialogfeld mit einer einzigen Schaltfläche und einem einzigen Fortschrittsbalken haben, sollte der Aufruf von dialog.ShowDialog() schneller erfolgen, als der Benutzer mit Ihrer Benutzeroberfläche interagieren kann. Ist das nicht der Fall?

2voto

TLiebe Punkte 7783

Für die Tastatureingabe können Sie versuchen, die Eigenschaft KeyPreview des Formulars auf True zu setzen. Dadurch werden alle Tastaturereignisse zuerst an das Formularobjekt und nicht an die einzelnen Steuerelemente weitergeleitet. Erstellen Sie einen Event-Handler für das KeyPress-Ereignis des Formulars und setzen Sie dort die Handled-Eigenschaft der KeyPressEventArgs auf True, um zu verhindern, dass der Tastendruck an eines der Steuerelemente weitergegeben wird. Wenn Sie gerade Daten vom Webdienst abrufen, setzen Sie die Eigenschaft Handled auf True, andernfalls setzen Sie sie auf False, und der Tastendruck wird an die Steuerelemente weitergegeben.

Wenn jemand eine gute Idee hat, wie man die Mauseingabe handhaben kann, sind Sie bereit.

0voto

bryanbcook Punkte 15032

In der Regel erstelle ich in meinem Formular die Funktionen LockUI() und UnlockUI(), mit denen die Steuerelemente umgeschaltet und ein lokales Formularfeld umgedreht werden, das als Flagge für einen lang laufenden Prozess dient. Dieser Ansatz funktioniert sehr gut, wenn Sie ein Befehlsmuster verwenden.

Wie bereits erwähnt, können Sie die Tastatureingabe umschalten, indem Sie die Eigenschaft KeyPreview des Formulars verwenden (wie von TLiebe vorgeschlagen).

Was die Mauseingabe betrifft, so können Sie die Mausaktivität deaktivieren, indem Sie die Option WinProc-Meldungen und das Abfangen von Mauseingabemeldungen . Dies ist im Grunde das, was KeyPreview tut.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X