Ven 08/06/2012 - Actualités

Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

Ven 08/06/2012 - Actualités

Message non lu par Xavier »

Copier-coller

XMo a écrit : Copier-coller
  • Nouveauté : le raccourci-clavier [Win + C] va permettre de copier en mémoire (de façon permanente) la chaine sélectionnée.
  • Nouveauté : le raccourci-clavier [Win + Entrée] va permettre d'afficher un menu des chaines stockées dans l'outil. Sélectionner l'une d'entre elles permettra de la coller dans une application tierce (en simulant l'utilisation de la combinaison [Ctrl + V]).
Petit problème... En XT3, les données des outils (ici Copier-coller) sont chargées à l'ouverture de leur fenêtre. Donc si l'outil est fermé, pas moyen d'accéder à ses données. Et court-circuiter la fenêtre pour accéder aux données directement à partir de la Barre n'est pas envisageable, le code de gestion de ses données étant une méthode d'instance de la fenêtre elle-même, donc inaccessible tnat que l'objet "fenêtre" n'est pas créé. :?

La solution idéale serait de déléguer la gestion des données de cet outil (chargement et sauvegarde) à la Barre, comme déjà fait pour les données des Alarmes et des Raccourcis, qui sont accessibles par la Barre sans que leurs fenêtre soit ouverte. Mais cela prendrait trop de temps en tests, XT3 n'étant pas objet, la moindre modification peut avoir des impacts à plusieurs endroits.

La solution qui va donc être tentée n'est pas très "éthique" :
  • Si la fenêtre n'est pas ouverte : déclenchement du bouton Copier-coller de la Barre. Cela permet de gérer la demande de mot de passe, d'ouvrir la fenêtre et de charger les données. La fenêtre sera sans doute rendue invisible, la chaine copiée sera insérée, puis la fenêtre sera refermée.
  • Si la fenêtre est déjà ouverte, la chaine copiée sera insérée dans la liste.
Il faudra sans doute faire la même manipulation pour le collage.

(Ce cas est un très bon exemple pour illustrer les problèmes d'évolutivité d'XT3 qui ont fini par le rendre totalement figé. :mrgreen: )
Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

Ven 08/06/2012 - Actualités

Message non lu par Xavier »

Copier


La copie fonctionne. Si la fenêtre était fermée, la demande de mot de passe se passe bien. La fenêtre est refermée si vite qu'il n'y a qu'un clignotement. Le passage en invisible ne le dissimulerait sans doute pas. Si la fenêtre est déjà ouverte, on voit juste la nouvelle chaine s'insérer.

XT3 ne pouvant pas (facilement) intervenir dans une application tierce pour en récupérer son texte sélectionné, le process simule un [Ctrl + C], qui copie la sélection dans le presse-papiers de Windows, lequel est ensuite lu par XT comme pour le mode manuel.

Le [Ctrl + C] simulé est obtenu par l'enfoncement puis le relâchement virtuels des touches :

Code : Tout sélectionner

		// Simulation de [Ctrl + C]
		Keybd_Event(VK_CONTROL, 0, 0, 0);
		Keybd_Event(Ord('C'), 0, 0, 0);
		Keybd_Event(Ord('C'), 0, KEYEVENTF_KEYUP, 0);
		Keybd_Event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

Ven 08/06/2012 - Actualités

Message non lu par Xavier »

Coller


Le collage a été (un peu) plus difficile.

Dans un premier temps il fallait construire et afficher un menu :
  • Interception de [Win + Entrée] par le Noyau.
  • Récupération de l'application tierce (via GetForegroundWindow et non GetActiveWindow ! :evil: ) et sauvegarde de son Handle en variable.
  • Ouverture de l'outil Copier-coller s'il ne l'est pas, avec gestion du mot de passe si besoin.
  • Création d'un menu dynamique, et ajout d'un élément de menu pour chaque chaine de l'outil.
  • Fermeture de l'outil.
  • Affichage du menu contextuel à l'emplacement du curseur souris. (Qui peut être différent du curseur de texte mais celui-ci ne semble pas récupérable de manière générique pour tous les types de widgets). Le problème a été d'obtenir que le menu ne se referme pas instantannément une fois affiché. Un "Application.ProcessMessages" force donc l'application a bien fermer la fenêtre de l'outil avant l'affichage du menu afin que celui-ci ne soit plus perturbé. :mrgreen:
Par la suite, il a fallu forcer le menu à "voler" le focus à l'application tierce (via un "SetForegroundWindow" de la fenêtre -invisible- du Noyau d'XT). Sans cela, l'utilisation des touches fléchées déplaçait le curseur dans l'application tierce au lieu de naviguer dans le menu.


La seconde étape est le collage lui-même :
  • Récupération du texte de l'élément de menu. Il a fallu empêcher Windows d'ajouter des "&" à chaque ligne, il fait cela afin de marquer la lettre surlignable via [Alt]. Donc "Menu.AutoHotkeys := maManual". Le texte du menu est alors copié dans un champ Edit invisible, seul moyen d'obtenir la fonction CopyToClipboard. Voilà, la chaine est dans le presse-papiers de Windows. :)
  • Le gros problème a été de forcer la réactivation de la fenêtre de l'application tierce (dont le Handle a été précédemment sauvé en variable). C'est finalement la totalité de l'arsenal des fonctions Windows qui a dû être utilisé afin d'y parvenir ! :o

    Code : Tout sélectionner

    	BringWindowToTop(Active_Window);
    	SetActiveWindow(Active_Window);
    	SetForegroundWindow(Active_Window);
    
  • Ensuite le collage du presse-papier dans l'application active :

    Code : Tout sélectionner

    	// Simulation de [Ctrl + V]
    	Keybd_Event(VK_CONTROL, 0, 0, 0);
    	Keybd_Event(Ord('V'), 0, 0, 0);
    	Keybd_Event(Ord('V'), 0, KEYEVENTF_KEYUP, 0);
    	Keybd_Event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
    
  • Et finalement la destruction du menu dynamique, pour éviter les fuites mémoire.
Denis
Messages : 180
Enregistré le : jeu. 23 juin 2011 09:21

Re: Ven 08/06/2012 - Actualités

Message non lu par Denis »

hé béh, il faut une bonne maitrise! Les Application.ProcessMessages me rappelle bien des choses ;-)
Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

Re: Ven 08/06/2012 - Actualités

Message non lu par Xavier »

DMo a écrit :hé béh, il faut une bonne maitrise! Les Application.ProcessMessages me rappelle bien des choses ;-)
J'espère bien, c'est toi qui me l'a appris. ;)
Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

Ven 08/06/2012 - Actualités

Message non lu par Xavier »

Prochaine version XT3


The X-Tools 3.7.2 est finalisé, et son fichier d'aide est à jour. Il sera livré demain, d'ici là il sera testé en utilisation réelle.
Répondre