Classe ECLKeyNotify

ECLKeyNotify est une classe de base abstraite. Une application ne peut pas créer directement une instance de cette classe. Pour utiliser cette classe, l'application doit définir sa propre classe dérivée d'ECLKeyNotify. L'application doit implémenter la fonction membre NotifyEvent() dans sa classe dérivée. Elle peut également éventuellement implémenter les fonctions membres NotifyError() et NotifyStop().

La classe ECLKeyNotify est utilisée pour permettre à une application d'être avertie des événements de frappe. L'application peut également choisir de filtrer (supprimer) les frappes afin qu'elles ne soient pas envoyées à l'écran hôte, ou de les remplacer par d'autres frappes. Les notifications de frappe sont mises en file d'attente afin que l'application reçoive toujours une notification pour chaque frappe. Seules les frappes effectuées par le clavier physique réel sont détectées par cet objet. Les frappes envoyées à l'hôte par d'autres objets ECL (tels que ECLPS::SendKeys) ne provoquent pas d'événements de notification de frappe.

Pour être averti des événements de frappe, l'application doit effectuer les étapes suivantes :
  1. Définir une classe dérivée d'ECLKeyNotify.
  2. Implémenter la classe dérivée et implémenter la fonction membre NotifyEvent().
  3. Implémenter éventuellement les fonctions NotifyError() et/ou NotifyStop().
  4. Créer une instance de la classe dérivée.
  5. Enregistrer l'instance avec la fonction ECLPS::RegisterKeyEvent().

L'exemple présenté montre comment cela peut être réalisé. Une fois les étapes ci-dessus terminées, chaque frappe dans la fenêtre de l'émulateur entraînera l'appel de la fonction membre NotifyEvent() de l'application. La fonction reçoit des paramètres indiquant le type de frappe (touche ASCII simple ou touche de fonction spéciale) et la valeur de la touche (un seul caractère ASCII ou un mot clé représentant une touche de fonction). L'application peut exécuter toutes les fonctions requises dans la procédure NotifyEvent(), y compris l'appel d'autres fonctions ECL telles que ECLPS::SendKeys(). L'application renvoie une valeur de NotifyEvent() pour indiquer si la frappe doit être filtrée ou non (renvoyer 1 pour filtrer (ignorer) la frappe, renvoyer 0 pour qu'elle soit traitée normalement).

Si une erreur est détectée lors de la génération d’un événement de frappe, la fonction membre NotifyError() est appelée avec un objet ECLErr. Les événements de frappe peuvent ou non continuer à être générés après une erreur, selon la nature de l'erreur. Lorsque la génération d'événements se termine (soit en raison d'une erreur, en appelant ECLPS::UnregisterKeyEvent, soit par destruction de l'objet ECLPS), la fonction membre NotifyStop() est appelée. Quelle que soit la manière dont la notification d'événement est terminée, la fonction membre NotifyStop() est toujours appelée et l'objet application n'est pas enregistré.

Si l'application ne fournit pas d'implémentation de la fonction membre NotifyError(), l'implémentation par défaut est utilisée (une simple boîte de message s'affiche à l'utilisateur). L'application peut remplacer le comportement par défaut en implémentant la fonction NotifyError() dans la classe dérivée de l'application. De même, la fonction NotifyStop() par défaut est utilisée si l'application ne fournit pas cette fonction (le comportement par défaut est de ne rien faire).

Notez que l'application peut également choisir de fournir ses propres constructeur et destructeur pour la classe dérivée. Cela peut être utile si l'application souhaite stocker des données spécifiques à l'instance dans la classe et transmettre ces informations en tant que paramètre au constructeur. Par exemple, l'application peut souhaiter publier un message dans une fenêtre d'application lorsqu'une frappe sur une touche est effectuée. Plutôt que de définir le descripteur de la fenêtre en tant que variable globale (afin qu'il soit visible par la fonction NotifyEvent()), l'application peut définir un constructeur pour la classe qui prend le descripteur de la fenêtre et le stocke dans la zone de données du membre de la classe.

L'application ne doit pas détruire l'objet de notification alors qu'il est enregistré pour recevoir des événements.

La même instance d'un objet de notification de frappe au clavier peut être enregistrée auprès de plusieurs objets ECLPS pour recevoir des frappes au clavier pour plusieurs connexions. Ainsi, une application peut utiliser une seule instance de cet objet pour traiter les frappes sur n'importe quel nombre de sessions. Les fonctions membres reçoivent un pointeur vers l'objet ECLPS pour lequel l'événement s'est produit afin qu'une application puisse distinguer les événements sur différentes connexions. L'exemple présenté utilise le même objet pour traiter les frappes sur deux connexions.

Restriction d'implémentation : actuellement, l'objet ECLPS autorise l'enregistrement d'un seul objet de notification pour une connexion donnée. ECLPS::RegisterKeyEvent générera une erreur si un objet de notification est déjà enregistré pour cet objet ECLPS.