IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Handle d'un document MS Word en cours d'édition


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2006
    Messages : 26
    Points : 21
    Points
    21
    Par défaut Handle d'un document MS Word en cours d'édition
    Je cherche à obtenir le handle du contrôle d'édition actif de n'importe quelle application externe en cours d'exécution, afin de pouvoir envoyer par la suite à ce contrôle un sendmessage WM_PASTE.
    (Développement sous DELPHI 7 personal edition)
    Je suis presque parvenu à mes fins grâce à la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    function GetFocus: HWND;
    var
      Wnd: HWND;
      TId, PId: DWORD;
    begin
      Result := windows.GetFocus;
      if Result = 0 then begin
        Wnd := GetForegroundWindow;
        if Wnd <> 0 then begin
          TId := GetWindowThreadProcessId(Wnd, PId);
          if AttachThreadInput(GetCurrentThreadId, TId, True) then begin
            Result := windows.GetFocus;
            AttachThreadInput(GetCurrentThreadId, TId, False);
          end;
        end;
      end;
    end;
    (En tant que de besoin, je précise que mon application s'exécute sous forme de "TrayIcon" et que la fonction est appelée à partir d'une HOTKEY)

    Tout fonctionne parfaitement avec les diverses applications que j'ai pu tester (Notepad, notepad++, wordpad, une cellule excel, chrome, un edit dans paint, ....) : La fonction me retourne le handle du "document" en cours d'édition et par un SendMessage(TheFocusedControl, WM_PASTE, 0,0), je parviens à envoyer à l'application externe le contenu du presse-papier.

    En revanche, cela ne fonctionne pas avec un document MS WORD : La fonction me retourne bien un handle, mais le WM_PASTE ne produit aucun effet.

    J'ignore si ce dysfonctionnement provient d'un mauvais Handle qui me serait retourné par ma fonction GetFocus, ou d'un mauvais usage de la fonction SendMessage.

    Merci d'avance à ceux d'entre vous qui pourront orienter mes recherches.

    P.S. : N'ayant aucune formation en programmation, vous voudrez bien excuser les inepties que j'ai pu exprimer ici.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    GetActiveOleObject permettra de récupérer l'objet OLE Word, ensuite, il sera plus aisé de parcourir les documents et le manipuler car pas convaincu que le controle d'édition de word soit accessible comme un vulgaire Memo, d'ailleurs si tu as le handle du champ, au lieu d'un WM_PASTE, on peut utiliser plutot WM_SETTEXT
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    Le plus simple est de générer un CTRL+V.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    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);

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Et il faut viser le bon controle, tu peux par exemple être dans le selecteur de Font et non dans la zone de texte

    recuperer le handle de la zone d'edition de word

    en 2008, la Font c'était une RichEdit20W maintenant c'est un RichEdit60W
    Par contre, _WwG n'a pas changé de nom

    Nom : Word.OpusApp.jpg
Affichages : 211
Taille : 91,1 Ko
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2006
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    Je vous remercie à tous pour ces précisions.
    Je vais donc poursuivre mes recherches avec les conseils donnés, et ne manquerai pas de vous faire part de la solution que j'aurai trouvé si j'y parviens.

Discussions similaires

  1. Fusion de document Access Word
    Par FCL31 dans le forum VBA Access
    Réponses: 1
    Dernier message: 23/04/2008, 12h58
  2. [Bug] Plaçage du curseur en début de document (Excel -> Word)
    Par ML0808 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/04/2008, 09h50
  3. Lire un document Scientific Word avec Latex
    Par OROZCO dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 1
    Dernier message: 03/08/2007, 14h56
  4. Protection de document sous WORD
    Par tiftay01 dans le forum Word
    Réponses: 4
    Dernier message: 11/01/2007, 16h25
  5. Réponses: 8
    Dernier message: 19/10/2006, 09h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo