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

Delphi Discussion :

WebBrowser OnMouseMove impossible


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 21
    Points
    21
    Par défaut WebBrowser OnMouseMove impossible
    Bonjour.
    J'utilise un Twebbrowser pour afficher une page de geoportail. Je voudrais déplacer la carte de façon précise et automatique. Pour ceci je pensais simuler le déplacement de la souris (send message) mais il semble que ce soit impossible. Qui a une piste ?
    Merci.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 21
    Points
    21
    Par défaut Une partie de la solution?
    Voilà ce que j'ai écrit :
    Position = les coordonnées écran de mon Webbrowser (Tpoint)
    j = la longueur de mon déplacement (plus petit que la largeur du Webbrowser)

    Pour déplacer de gauche à droite en réponse a un bouton:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SetCursorPos(position.X,position.y);
    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
    for i:=position1.X to position1.X+j do
    begin
    SetCursorPos(i,position1.y);
    end;
    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    j'ai essayé sans succès mouse_event(MOUSEEVENTF_MOVE,j,0,0,0) à la place de la boucle

  3. #3
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    Tu peux pas jouer avec les positions des scrollbars ?

  4. #4
    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
    C'est bien avec mouse_event(MOUSEEVENTF_MOVE) qu'il faut notifier le mouvement. Il n'y a pas de message souris avec SetCursorPos. Attention cependant, le mouvement réel en relatif dépend aussi de l’accélération de la souris définie au niveau OS. Pour de la précision, il faut passer par des coordonnées absolues mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE) et calculer la position en mickey et non en pixel.

    Pour un mouvement de 100px :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, (Mouse.CursorPos.X +100) *65535 div screen.Width, Mouse.CursorPos.Y *65535 div screen.Height, 0, 0);
    En mickey, la position 0/0 correspond au coin supérieur gauche de l'écran principal et 65535/65535 au coin inférieur droit. Dans un environnement multi-moniteur, il faut encore spécifier MOUSEEVENTF_VIRTUALDESK pour que la position 0/0 corresponde au coin supérieur gauche du bureau et évidemment 65535/65535 à son coin inférieur droit.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par retwas Voir le message
    Tu peux pas jouer avec les positions des scrollbars ?
    Merci pour cette réponse mais la page s'ouvre sans scrollbars.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    C'est bien avec mouse_event(MOUSEEVENTF_MOVE) qu'il faut notifier le mouvement. Il n'y a pas de message souris avec SetCursorPos. Attention cependant, le mouvement réel en relatif dépend aussi de l’accélération de la souris définie au niveau OS. Pour de la précision, il faut passer par des coordonnées absolues mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE) et calculer la position en mickey et non en pixel.

    Pour un mouvement de 100px :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, (Mouse.CursorPos.X +100) *65535 div screen.Width, Mouse.CursorPos.Y *65535 div screen.Height, 0, 0);
    En mickey, la position 0/0 correspond au coin supérieur gauche de l'écran principal et 65535/65535 au coin inférieur droit. Dans un environnement multi-moniteur, il faut encore spécifier MOUSEEVENTF_VIRTUALDESK pour que la position 0/0 corresponde au coin supérieur gauche du bureau et évidemment 65535/65535 à son coin inférieur droit.
    Merci, maintenant ça marche avec : Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE...
    J'utilise deux écran et j'ai donc essayé MOUSEEVENTF_VIRTUALDESK j'ai alors une erreur à la compilation (identificateur non déclaré). Cependant les deux écrans ne semblent pas poser de problèmes. J'ajoute qu'il ne faut oublier de mettre le focus sur le webbrowser (mon bouton de commande est sur une autre form).

  7. #7
    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
    Citation Envoyé par bauschr Voir le message
    J'utilise deux écran et j'ai donc essayé MOUSEEVENTF_VIRTUALDESK j'ai alors une erreur à la compilation (identificateur non déclaré).
    const MOUSEEVENTF_VIRTUALDESK = $4000;

    Citation Envoyé par bauschr Voir le message
    Cependant les deux écrans ne semblent pas poser de problèmes.
    Ca ne pose pas de problème tant que le déplacement est inférieur ou égal à 65535 mickeys

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 21
    Points
    21
    Par défaut Réaction différente selon le site
    Bonjour.
    Je pensais le problème résolu mais jusqu'ici la page "géoportail" que j'ouvrais avec le webbrowser était une page personnelle (http://chateau.branlant.free.fr/copi...cementv20.html).
    En utilisant le site de géoportail (https://www.geoportail.gouv.fr/) il est impossible de déplacer une carte avec la souris et donc impossible d'utiliser "mouse_event(MOUSEEVENTF_MOVE)".
    Quelqu'un a une piste ?

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur multiplateformes
    Inscrit en
    Mars 2003
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur multiplateformes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2003
    Messages : 273
    Points : 628
    Points
    628
    Par défaut
    Citation Envoyé par bauschr Voir le message
    Bonjour.
    J'utilise un Twebbrowser pour afficher une page de geoportail. Je voudrais déplacer la carte de façon précise et automatique. Pour ceci je pensais simuler le déplacement de la souris (send message) mais il semble que ce soit impossible. Qui a une piste ?
    Merci.
    Une autre piste : ne serait-il pas plus logique d'utiliser l'API Geoportail :
    http://api.ign.fr/accueil
    qui permet justement de déplacer la carte, zoomer etc.

    Reste à piloter cette api conçue pour être utilisée en Javascript ou en Java à partir d'un site, en utilisant les composants idoines....
    Voir aussi peut-être TMapView avec Google Maps et
    http://api.ign.fr/jsp/site/Portal.js...&dossier_id=74

  10. #10
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 21
    Points
    21
    Par défaut Api géoportail
    Merci pour la réponse.
    La page qui fonctionne et que je cite utilise l'API de géoportail avec 4 boutons qui commandent le déplacement. Mais je souhaite écrire une application qui fonctionne dans tous les cas de figure (avec un autre site par exemple). Il semble qu'il faut passer par "webbrowser.document" mais là je bloque.

  11. #11
    Membre confirmé
    Homme Profil pro
    Développeur multiplateformes
    Inscrit en
    Mars 2003
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur multiplateformes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2003
    Messages : 273
    Points : 628
    Points
    628
    Par défaut
    Citation Envoyé par bauschr Voir le message
    Merci pour la réponse.
    La page qui fonctionne et que je cite utilise l'API de géoportail avec 4 boutons qui commandent le déplacement. Mais je souhaite écrire une application qui fonctionne dans tous les cas de figure (avec un autre site par exemple). Il semble qu'il faut passer par "webbrowser.document" mais là je bloque.
    Le temps me manque pour approfondir la question.
    Vous avez exploré ce qu'il est possible de faire avec la méthode TWebBrowser.EvaluateJavaScript ?

  12. #12
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 21
    Points
    21
    Par défaut Toujours pas de solution
    Citation Envoyé par yvslms Voir le message
    Le temps me manque pour approfondir la question.
    Vous avez exploré ce qu'il est possible de faire avec la méthode TWebBrowser.EvaluateJavaScript ?
    Cette méthode n'est pas présente sur ma version (delphi 7, windows 10).

    J'ai le même résultat avec un OLEContainer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    adresse : string
     
    olecontainer1.CreateObject('Shell.Explorer',false);
    olecontainer1.DoVerb(-1);
    olecontainer1.OleObject.navigate2(adresse);
    Si j'ouvre ma page personnelle sur géoportail (http://chateau.branlant.free.fr/copi...cementv20.html) aucun problème.
    Si j'ouvre géoportail (https://www.geoportail.gouv.fr/carte/) impossible de déplacer la carte avec la souris.
    Je continue donc a chercher ...

  13. #13
    Membre confirmé
    Homme Profil pro
    Développeur multiplateformes
    Inscrit en
    Mars 2003
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur multiplateformes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2003
    Messages : 273
    Points : 628
    Points
    628
    Par défaut
    Citation Envoyé par bauschr Voir le message
    ....
    Cette méthode n'est pas présente sur ma version (delphi 7, windows 10).
    ....
    Vous pouvez aussi télécharger la dernière version de Delphi gratuitement ("Starter" pour Win32 uniquement).
    Pour le reste tenez nous au courant, perso le sujet m'intéresse.
    J'ai vu aussi que l'IGN venait de sortir une nouvelle version de son SDK.
    Je tâcherai de m'y pencher dès que j'aurai un moment.

    Bon courage.

  14. #14
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par yvslms Voir le message
    Vous pouvez aussi télécharger la dernière version de Delphi gratuitement ("Starter" pour Win32 uniquement).
    Pour le reste tenez nous au courant, perso le sujet m'intéresse.
    J'ai vu aussi que l'IGN venait de sortir une nouvelle version de son SDK.
    Je tâcherai de m'y pencher dès que j'aurai un moment.

    Bon courage.
    Pas de chance pour moi la version Delphi d'embarcadero plante sur mon PC...

    Je continue mes recherches en m'appuyant sur le fait que la molette fonctionne (zoom sur la carte). J'ai récupérer les valeurs envoyées lorsqu'on utilise celle-ci (Msg.wParam et Msg.lParam ainsi que Msg.hwnd). Puis avec un bouton j'envoie le message suivant sendmessage(fenetre,WM_MOUSEWHEEL,7864320,32049148); avec fenetre=Msg.hwnd, 7864320=Msg.wParam, 32049148=Msg.lParam
    Le clic sur mon bouton provoque bien un zoom.
    Si je le modifie ainsi :
    sendmessage(webbrowser1.Handle,WM_MOUSEWHEEL,7864320,32049148);
    Rien ne se passe...
    A noter que j'ouvre une autre page internet Msg.hwnd change.
    Mais pour l'instant cela ne me donne pas la solution...

  15. #15
    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
    Essaye déjà de remplacer webbrowser1.Handle par GetForegroundWindow.

    Ensuite, ces nombres écrits ainsi 7864320, 32049148 ne sont pas très parlants. En héxa ce serait déjà un peu mieux : $00780000, $01E907FC.

    Soit pour :
    wParam : $0078 = 120 = un WHEEL_DELTA et $0000 pour aucun bouton enfoncé ;
    lParam : y = $01E9 = 489px, x = $07FC = 2044px.

    Une façon plus propre d'écrire cela est de passer par la construction des paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    X := 2044;
    Y := 489;
    SendMessage(GetForegroundWindow, WM_MOUSEWHEEL, MakeWParam(0, WHEEL_DELTA), MakeLParam(X, Y));
    Maintenant, il faut savoir que même si ce message est bien envoyé au bon contrôle fenêtré (ce qui n'est pas encore sûr), il faut obligatoirement que le curseur soit positionné sur ce composant (que X et Y soient corrects). Si la position 2044/489 n'est pas dans la zone de l'élément scrollable/zoomable ça ne fonctionne pas. lParam n'est en aucun cas une constante.

    Il serait à nouveau plus simple de simuler cette molette par Mouse_Event(MOUSEEVENTF_WHEEL) et laisser l'OS déterminer la fenêtre cible lui-même.

  16. #16
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 21
    Points
    21
    Par défaut Merci pour cet éclairage.
    Citation Envoyé par Andnotor Voir le message
    Essaye déjà de remplacer webbrowser1.Handle par GetForegroundWindow.

    Ensuite, ces nombres écrits ainsi 7864320, 32049148 ne sont pas très parlants. En héxa ce serait déjà un peu mieux : $00780000, $01E907FC.

    Soit pour :
    wParam : $0078 = 120 = un WHEEL_DELTA et $0000 pour aucun bouton enfoncé ;
    lParam : y = $01E9 = 489px, x = $07FC = 2044px.

    Une façon plus propre d'écrire cela est de passer par la construction des paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    X := 2044;
    Y := 489;
    SendMessage(GetForegroundWindow, WM_MOUSEWHEEL, MakeWParam(0, WHEEL_DELTA), MakeLParam(X, Y));
    Maintenant, il faut savoir que même si ce message est bien envoyé au bon contrôle fenêtré (ce qui n'est pas encore sûr), il faut obligatoirement que le curseur soit positionné sur ce composant (que X et Y soient corrects). Si la position 2044/489 n'est pas dans la zone de l'élément scrollable/zoomable ça ne fonctionne pas. lParam n'est en aucun cas une constante.

    Il serait à nouveau plus simple de simuler cette molette par Mouse_Event(MOUSEEVENTF_WHEEL) et laisser l'OS déterminer la fenêtre cible lui-même.

    Votre réponse me permet de mieux comprendre ces paramètres, mais malheureusement ce n'est pas le sujet principal.
    Mon souci est l'impossibilité de déplacer une carte en ouvrant géoportail dans mon application.
    Le sendmessage n'a été écris que pour vérifier que j'arrivais bien a envoyer un message sur le webbrowser (comme le site réagit à la molette j'ai utilisé cet événement).
    Je me suis alors rendu compte que webbrowser1.Handle n'était pas le bon paramètre. Mais tout cela n'explique pas pourquoi geoportail ouvert par un webbrowser interagi avec la molette mais pas a un déplacement de la souris.

  17. #17
    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
    Citation Envoyé par bauschr Voir le message
    Mais tout cela n'explique pas pourquoi geoportail ouvert par un webbrowser interagi avec la molette mais pas a un déplacement de la souris.
    Est-ce que ça fonctionne dans Internet Explorer ?
    Si oui, as-tu essayé de mettre à jour le TWebBrowser (menu Composant -> Importer un composant -> Importer un contrôle ActiveX -> Microsoft Internet Controls) ?

    Pense qu'il est difficile de t'aider, TWebBrowser n'est qu'une grosse boîte noire (un contrôle ActiveX) et savoir ce qui se passe à l'intérieur est un mystère.

Discussions similaires

  1. [ArchiveBuilder][JavaMail] exécution impossible...
    Par Gorthal dans le forum JBuilder
    Réponses: 7
    Dernier message: 10/01/2003, 09h12
  2. Réponses: 8
    Dernier message: 20/11/2002, 11h50
  3. Réponses: 3
    Dernier message: 01/11/2002, 14h30
  4. Webbrowser : Comment ne pas prendre la page en cache
    Par cedm78 dans le forum Web & réseau
    Réponses: 3
    Dernier message: 30/08/2002, 11h17
  5. Détections avec WebBrowser
    Par Wazo_Sportive dans le forum Composants VCL
    Réponses: 4
    Dernier message: 11/08/2002, 19h32

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