Comment bloquer toutes les entrées clavier et souris sur mon application WinForms?

J’ai une application WinForms qui récupère des données d’un service Web sur un thread de travail et je dois désactiver toutes les entrées dans mon application jusqu’à ce que les données soient chargées.

Actuellement, je crée un formulaire semi-transparent et le place sur mon application. Lorsque l’appel de données est terminé, je ferme ce formulaire. Cela fonctionne bien et accepte que cela provoque des problèmes de performance considérables pour les utilisateurs exécutant l’application sur les services de terminal. J’ai essayé de rendre la superposition entièrement transparente mais cela déclenche toujours deux redessins de la fenêtre entière, donc cela n’a pas aidé du tout.

Je sais qu’une recommandation commune pour gérer cela est de désactiver tous les contrôles, mais cela permettrait également de redessiner une grande partie de l’écran, donc je cherche un autre moyen de bloquer toutes les entrées utilisateur. Toute assistance sera grandement appréciée!

MISE À JOUR: J’aurais dû mentionner que nous avons considéré le dialog modal. Actuellement, nous montrons l’incrustation, lancez le thread d’access aux données, puis construisez le formulaire. S’il n’y a pas de meilleur moyen de bloquer l’entrée (App.BlockInput () pourrait être sympa) alors nous pourrions utiliser l’idée du dialog modal, mais nous aurions besoin d’attendre que la construction du formulaire soit terminée et qu’il n’y ait pas de emplacement pour faire cela.

Vous pouvez afficher un petit modalForm.ShowDialog(yourForm) modal ( modalForm.ShowDialog(yourForm) ) avec la barre de progression modalForm.ShowDialog(yourForm) sur votre application. Cela ne provoquera pas de nouvelles zones.

Si votre application est réellement bloquée pendant l’exécution de l’opération, je ferais ce que fait fréquemment Microsoft: ouvrez une boîte de dialog modale contenant une animation throbber ou une barre de progression, ainsi qu’un bouton Annuler. Redraw est limité car vous ne dessinez que la taille de la nouvelle boîte de dialog et que la saisie dans le rest de votre application est bloquée car la boîte de dialog est modale. En outre, les utilisateurs sont beaucoup plus enclins à attendre lorsque vous recevez des mises à jour de statut et / ou des animations, car il semble que l’ordinateur fonctionne.

Cependant, s’il existe des opérations que votre utilisateur peut effectuer pendant l’exécution de votre demande de service Web, il est préférable de laisser les contrôles accessibles. Au moins, il devrait toujours y avoir un moyen d’interrompre / d’abandonner le processus.

Mise à jour : Depuis que vous avez changé la question: combien de temps faut-il pour construire le dialog modal? Pourquoi ne pas simplement construire la boîte de dialog vide, puis remplir ses contrôles? Si tout ce que vous avez est une petite boîte de dialog avec un seul bouton et un seul ProgressBar, alors l’appel de dialog.ShowDialog () doit se produire plus rapidement que votre utilisateur ne peut interagir avec votre interface utilisateur. N’est-ce pas le cas?

Utiliser Application.AddMessageFilter peut le faire: Capturer les événements de la souris à partir de chaque composant sur C # WInForm

Une chose que vous pouvez essayer pour la saisie au clavier est de définir la propriété KeyPreview du formulaire sur True. Cela passera d’abord tous les événements de clavier à l’object Formulaire plutôt qu’aux contrôles individuels. Créez un gestionnaire d’événement pour l’événement KeyPress du formulaire. Vous pouvez y définir la propriété Handled du KeyPressEventArgs sur True pour empêcher le passage de la touche à l’un des contrôles. Si vous récupérez actuellement des données du service Web, définissez la propriété Handled sur True, sinon définissez-la sur False et le trait de clé sera transmis aux contrôles.

Si quelqu’un a une bonne idée sur la façon de gérer la saisie de la souris, vous êtes défini.

Je crée généralement des fonctions LockUI () et UnlockUI () dans mon formulaire qui permettent de basculer les contrôles et d’inverser un champ de formulaire local qui agit comme un indicateur pour indiquer un processus de longue durée. Cette approche fonctionne très bien si vous utilisez un modèle de commande.

Comme mentionné précédemment, vous pouvez basculer la saisie au clavier en utilisant la propriété KeyPreview du formulaire (comme suggéré par TLiebe).

En ce qui concerne la saisie de la souris, vous pouvez désactiver l’activité de la souris en raccordant les messages WinProc et en interceptant les messages d’entrée de la souris . C’est essentiellement ce que fait KeyPreview.