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

MFC Discussion :

[BHO] Plugin IE : récupérer la sélection dans le navigateur


Sujet :

MFC

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 25
    Points : 11
    Points
    11
    Par défaut [BHO] Plugin IE : récupérer la sélection dans le navigateur
    Bonjour,
    je travaille actuellement sur le développement d'un plugin IE (BHO: Browser Helper Objects). Ce plugin ajoute au menu contextuel du click droit une option supplémentaire seulement si le click est fait sur un texte sélectionné.
    Je sais détecter le click sur cette nouvelle option du menu mais j'ai maintenant besoin de récupérer la valeur sélectionnée qui me permettra le traitement derrière.

    J'ai essayé plusieurs méthodes mais soit je les ai mal utilisée soit ça n'était pas les bonnes.

    méthode 1 : renvoie une chaine vide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //int len = ::GetWindowTextLength(hWnd); //renvoie 0
    LPTSTR handledString = new TCHAR[100];
    if(::GetWindowText(hWnd, handledString, 100))
          MessageBox(NULL, handledString, _T("Selected text acquired"), MB_OK);
    méthode 2 : fait planter IE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char buffer[30];
    SendMessage(hWnd, WM_GETTEXT, 30, (LPARAM) buffer);

    Si vous avez des idées de la provenance de mon erreur...
    N'hésitez pas à demander plus de précisions si cela peut vous aider.
    merci d'avance

  2. #2
    mat.M
    Invité(e)
    Par défaut
    1.
    hWnd est peut-être invalide.
    Vérifier en débogauge

    2.
    C'est peut-être du à un pb de conversion Ansi->Unicode
    WM_GETTEXT Message

    --------------------------------------------------------------------------------

    An application sends a WM_GETTEXT message to copy the text that corresponds to a window into a buffer provided by the caller.

    Syntax


    To send this message, call the SendMessage function as follows.
    lResult = SendMessage( // returns LRESULT in lResult (HWND) hWndControl, // handle to destination control (UINT) WM_GETTEXT, // message ID (WPARAM) wParam, // = (WPARAM) () wParam; (LPARAM) lParam // = (LPARAM) () lParam; );
    Parameters

    wParam
    Specifies the maximum number of TCHARs to be copied, including the terminating null character.

    Windows NT/2000/XP:ANSI applications may have the string in the buffer reduced in size (to a minimum of half that of the wParam value) due to conversion from ANSI to Unicode.


    lParam
    Pointer to the buffer that is to receive the text.
    Return Value

  3. #3
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    c'est quoi ce hwnd ? c'est le handle d'IE ? ca va te récuperer le titre de la fenetre, et pas ce que tu sélectionnes

    pourquoi ne pas simuler un copier-coller, comme ca tu aurais le texte selectionné dans le presse papier

  4. #4
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par nico-pyright(c)
    c'est quoi ce hwnd ? c'est le handle d'IE ? ca va te récuperer le titre de la fenetre, et pas ce que tu sélectionnes
    C'est bien ça, hWnd est le handle de IE et j'ai regardé il est valide. Je viens de le voir dans MSDN que ça ne récupérait que le titre de la fenêtre.

    Citation Envoyé par nico-pyright(c)
    pourquoi ne pas simuler un copier-coller, comme ca tu aurais le texte selectionné dans le presse papier
    Je regarde, j'ai vu quelquechose à ce propos sur ce forum (http://www.developpez.net/forums/showthread.php?t=10254) mais le résultat ne s'y trouve pas. Je vais essayer de mon côté.

  5. #5
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	 keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),0,0);
    	 keybd_event(0x43,MapVirtualKey(0x43,0),0,0);
    	 keybd_event(0x43,MapVirtualKey(0x43,0),KEYEVENTF_KEYUP,0);
    	 keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),KEYEVENTF_KEYUP,0);

  6. #6
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Merci de l'aide, j'essaie ça demain dans l'après midi (je ne peux pas avant, dsl).
    Bonne soirée vous deux

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    J'ai fait l'essai ce matin, le "copier" fonctionne, merci de la solution. En revanche j'ai un petit soucis pour récupérer la valeur du presse-papier, je n'ai que des carrés. Voici mon code (hWnd est toujours le pointeur sur mon IE et il est valide) :

    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
    LPTSTR lptstr;
    HGLOBAL hglb;
     
    if(IsClipboardFormatAvailable(CF_TEXT) && ::OpenClipboard(hWnd)) 
    {
    	hglb = GetClipboardData(CF_TEXT); 
    	if (hglb != NULL) 
    	{
    		lptstr = (LPTSTR)GlobalLock(hglb);
    		MessageBox(NULL, lptstr, _T("Selected Text"), MB_OK);
    		GlobalUnlock(hglb);
    		EmptyClipboard();
    		CloseClipboard();
    	}
    }

  8. #8
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    j'ai testé ca, ca fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	 OpenClipboard (NULL);
    	 HGLOBAL     hGlobal;
    	 PTSTR       pGlobal;
    	 hGlobal = GetClipboardData (CF_TEXT);
    	 if (hGlobal)
    	 {
    		 pGlobal = (PTSTR) GlobalLock (hGlobal);
    		 MessageBox(NULL,pGlobal, "", 0);
    		 GlobalUnlock (hGlobal);
    	 }
    	 CloseClipboard ();

  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par nico-pyright(c)
    j'ai testé ca, ca fonctionne
    Pour moi c'est le même résultat... toujours des carrés.
    Je n'utilise pas les CString dans mon projet ATL, ça pourrait avoir un lien? Ou peut-être le fait de faire appel au presse-papier dans un plugin IE? En fait je vois pas trop ce qui coince.
    Ce qui m'étonne c'est que j'ai toujours la même séquence (à vu d'oeil en tout cas) peu importe ma sélection, c'est à dire 9 carrés puis 1 parenthèse

  10. #10
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    si tu es en unicode, il faut faire autrement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    hGlobal = GetClipboardData (CF_UNICODETEXT) ;

  11. #11
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par nico-pyright(c)
    si tu es en unicode
    Effectivement, autant pour moi.

    Par contre j'ai un petit comportement que je n'arrive pas à saisir : je dois faire deux fois l'action click pour avoir un messagebox. Pourtant le presse papier semble bien rempli, j'ai l'impression que keybd_event n'est pas exécuté immédiatement et que messagebox échoue en se lançant trop vite.

    Sinon il faut absolument utiliser EmptyClipboard(); après l'exécution de l'action, sinon le "CTRL+C" avec des keybd_event ne modifie jamais la valeur! J'ai essayé de le faire avant mais dans ce cas là je n'ai jamais aucun messagebox (certainement le même problème qui fait que le CTRL+C n'est pas encore fait au moment de la récupération de la donnée).

  12. #12
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    je ne comprends pas

    a quel moment fais-tu le copier-coller ?

  13. #13
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Je commence par un copier, puis je récupère la donnée dans le presse-papier. Voilà le code :

    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
    19
    20
    21
    22
    23
    24
    //j'ai essayé de mettre le EmptyClipboard(); ici (avec un OpenClipboard(NULL) avant)
    keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL,0), 0, 0);
    keybd_event(0x43, MapVirtualKey(0x43,0), 0, 0);
    keybd_event(0x43, MapVirtualKey(0x43,0), KEYEVENTF_KEYUP, 0);
    keybd_event(VK_CONTROL,	MapVirtualKey(VK_CONTROL,0), KEYEVENTF_KEYUP, 0);
     
    LPTSTR lptstr;
    HGLOBAL hglb;
    if(OpenClipboard(NULL)) 
    {
    	hglb = GetClipboardData(CF_UNICODETEXT); 
    	if (hglb != NULL) 
    	{
    		lptstr = (LPTSTR)GlobalLock(hglb);
    		if(lptstr)
    		{
    			MessageBox(NULL, lptstr, _T("Selected Text"), MB_OK);
    		}
     
    		GlobalUnlock(hglb);
    		EmptyClipboard();
    		CloseClipboard();
    	}
    }

  14. #14
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    ma question était : "a quel moment" ?

    parce que si je teste juste ca dans une appli, ca marche bien ; donc il faut plus de détails sur le contexte

  15. #15
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Lors d'un click droit sur une sélection dans le navigateur, le menu contextuel apparait avec en plus un choix que j'ai ajouté. C'est lors du click sur ce choix que le copier est effectué (dans la méthode 'ShowContextMenu', je détecte sur quoi est effectué le click, si c'est le choix du menu que je désire, je lance l'action).
    C'est la réponse que tu voulais?

  16. #16
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    ok, j'avais oublié le contexte ...

    et si tu temporises avant de faire le messagebox, genre un Sleep(2000), ca change quelque chose ?

  17. #17
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    j'ai essayé, mais pas autant -> 500ms, et ça change rien malheureusement

  18. #18
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Est ce que 'keybd_event' agit immédiatement ou signale un changement dans les touches et Windows interprète ce changement quand il peut?

    J'ai lu sur cette page : http://tcharles.developpez.com/simul/
    Comme son nom l'indique, cette fonction ne signalera au système que les changements d'état des touches.
    Il n'est pas précisé que le système interprète aussitôt le changement.

  19. #19
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    en y repensant, l'idéal serait de ne pas passer par le presse-papier mais de récupérer directement la sélection dans la fenêtre IE, est-ce possible?
    je suis en train de regarder des documentations sur "GetWindowText", mais je n'ai pas l'impression que cela convienne... si vous avez des idées

  20. #20
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    Citation Envoyé par tomazy
    en y repensant, l'idéal serait de ne pas passer par le presse-papier mais de récupérer directement la sélection dans la fenêtre IE, est-ce possible?
    Là, je vois pas comment faire

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Récupérer la sélection dans un dropdown excel
    Par thepachat dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 12/04/2011, 20h29
  2. Récupérer une sélection dans l'explorateur windows
    Par Crystal Noir dans le forum VB.NET
    Réponses: 4
    Dernier message: 17/11/2008, 00h49
  3. Récupérer la sélection dans une feuille inactive
    Par phdphd dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 22/07/2008, 09h41
  4. Réponses: 7
    Dernier message: 14/04/2007, 17h25
  5. Récupérer une sélection dans une page
    Par philippe30 dans le forum Langage
    Réponses: 5
    Dernier message: 05/12/2005, 19h02

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