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

Composants VCL Delphi Discussion :

[D7] pb SetCursorPos après clic droit


Sujet :

Composants VCL Delphi

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 132
    Points
    15 132
    Par défaut [D7] pb SetCursorPos après clic droit
    Bonsoir,

    (bon dimanche ? )

    J'ai un petit souci pour positionner à un endroit précis le pointeur de la souris,
    lors de la création dynamique d'une form secondaire, création appelée par le choix d'un item dans un PopupMenu.

    J'ai constaté qu'à l'affichage de cette form le curseur reste à l'endroit où j'ai cliqué-droit sur la form principale.

    Toutes les combinaisons possibles et imaginables dans FormCreate, FormShow, FormActivate de
    la méthode SetCursorPos ne donnent rien, que la seconde form soit modale ou pas...

    Et si je rajoute un ShowMessage dans mes instructions de positionnement du pointeur,
    le pointeur reste à l'endroit du clic sur le bouton et d'ailleurs s'adapte au contexte qui
    se présente à lui à la disparition de la fenêtre ShowMessage : il se trouve que dessous
    j'avais un éditeur graphique, le curseur s'est transformé en croix de dessin.

    Alors j'essaye de cliquer sur cette form en changeant la propriété Checked d'un RadioButton, dans FormActivate comme dans FormShow,
    (d'après l'aide ça génère un click) mais va te rouler !
    Le pointeur reste là où a été physiquement cliqué, et la procédure FormClick n'est même pas appelée...

    On dirait que le pointeur est "capturé" par la boucle du PopupMenu.
    C'est possible ?
    C'est contournable ?
    Merci de vos idées,

    PS : le plus fou, c'est que le contrôle où je veux le pointeur, c'est une TrackBar, je la déclare
    comme ActiveControl de la form et quand elle s'affiche je peux faire glisser le curseur de
    cette TrackBar juste avec la molette de la souris !
    Mais j'aurais vraiment aimé voir le pointeur positionné sur le curseur...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  2. #2
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure TForm2.FormShow(Sender: TObject);
    var
      Pt : TPoint;
    begin
      Application.ProcessMessages;
      Pt.x := Button1.Left + (Button1.Width div 2);
      Pt.y := Button1.Top + (Button1.Height div 2);
      Pt := ClientToScreen(Pt);
      Pt.x := Round(Pt.x * (65535 / Screen.Width));
      Pt.y := Round(Pt.y * (65535 / Screen.Height));
      Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, Pt.x, Pt.y, 0, 0);
    end;
    Précision, ça ne fonctionne pas dans une VM

  3. #3
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 132
    Points
    15 132
    Par défaut
    Je suis maudit !
    Citation Envoyé par Papy214 Voir le message
    Précision, ça ne fonctionne pas dans une VM
    Bien senti, Papy214 : oublié (je ne pensais pas que c'était important) de préciser que je tourne dans une VM...

    Une autre idée ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  4. #4
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    autre idée ? En plus du code que j'ai fourni ?
    Celui-ci fonctionne ... créé avec D7 dans une VM, testé avec succès sur seven

    ( à moins que ton soft soit destiné à tourner exclusivement dans une VM )

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    autre idée ? En plus du code que j'ai fourni ? (...)
    Ben vi, puisque tu as bien dit que ça ne fonctionnait pas en VM.

    Citation Envoyé par Papy214 Voir le message
    ( à moins que ton soft soit destiné à tourner exclusivement dans une VM )
    C'est ce que je voulais dire, hélas ! Développé dans et exécuté pour une VM Vbox de mon vieux mais vaillant Win2k, VBox tournant sur Debian.

    Edit : ajout d'un touptitruc pour démontrer le problème

    Une petite form sans rien dessus, avec juste ce 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
    procedure TForm1.FormCreate(Sender: TObject);
    var
      pt: TPoint;
    begin
      Show;
      GetCursorPos(pt);
      Caption := IntTostr(pt.X)+'x'+IntTostr(pt.Y);
    end;
     
    procedure TForm1.FormClick(Sender: TObject);
    var
      pt: TPoint;
    begin
      GetCursorPos(pt);
      SetCursorPos(pt.X + Form1.Width, pt.Y + Form1.Height);
      GetCursorPos(pt);
      Caption := IntTostr(pt.X)+'x'+IntTostr(pt.Y);
    end;
    Au lancement, la form affiche l'emplacement du pointeur lorsqu'on appuie sur F9.

    Ensuite, il suffit de déplacer la form au dessus de l'éditeur de code et de cliquer : le pointeur se transforme en i majuscule classique, idem si la form est sur un éditeur graphique, en fonction de l'outil sélectionné le pointeur change.

    À peine on bouge la souris qu'on récupère le pointeur du bouton.

    Conclusion : le curseur s'est "baladé" puisque le pointeur a changé de tête en fonction du contexte, mais il est revenu à sa place d'origine en fin d'affichage de la procédure.

    Faudrait envoyer un message temporisé en fin de procédure, je sais pas trop quoi à qui, je sais pas trop comment faire...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    ça fonctionne si tu désactives les composants d'intégration. Çà rend la vm moins pratique mais ça élimine le problème.

    ou quand la vm est lancée, tu désactives juste l'intégration du pointer dans les paramètres. C'est un moindre mal.

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 132
    Points
    15 132
    Par défaut
    Bonjour, Papy214
    Citation Envoyé par Papy214 Voir le message
    ça fonctionne si tu désactives les composants d'intégration. Çà rend la vm moins pratique mais ça élimine le problème.

    ou quand la vm est lancée, tu désactives juste l'intégration du pointer dans les paramètres. C'est un moindre mal.
    Merci pour l'info mais ça ne m'arrange pas du tout ! Le moindre mal sera, pour moi, de ne pas avoir le pointeur là où il faut, c'est moins grave que la perte de certaines fonctionnalités.

    Je laisse ouvert, des fois que quelqu'un ait une autre idée.

    Merci, et bonne semaine,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Salut JP !

    Pourquoi ne pas essayer un ch'ti ClipCursor(nil) ?

    Cela libérera peut-être le curseur ? Un GetClipCursor permettrait d'ailleurs de savoir s'il est confiné.

    Je suis pê à côté de la plaque, comme ton curseur
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  9. #9
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 132
    Points
    15 132
    Par défaut
    Yves !
    Citation Envoyé par tourlourou Voir le message
    Salut JP !

    Pourquoi ne pas essayer un ch'ti ClipCursor(nil) ?

    Cela libérera peut-être le curseur ? Un GetClipCursor permettrait d'ailleurs de savoir s'il est confiné.

    Je suis pê à côté de la plaque, comme ton curseur
    Même comportement en insérant ClipCursor(nil);
    Je reste persuadé que ce foutu pointeur n'est libéré qu'en fin de procédure, et qu'il faudrait donc passer par un message qui s'exécuterait après la fin de la procédure.

    Ou alors un timer ? Un peu lourd, non ?

    Edit : je viens d'essayer le timer, pas mieux...

    En fait, j'essaye de simuler le déplacement de la souris à la main, c'est aussi simple que ça (à écrire ! Parce qu'à coder et à exécuter dans la VM, euh..., c'est tendu -- ou alors je m'y prends mal)
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  10. #10
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    J'ai aussi essayé avec le timer lors de mon test. Ca ne change rien.
    D'ailleurs, si tu appelles SetCursorPos directement sur la première fiche au lieu d'en appeler une seconde, le problème est identique.

    Précision: différents post sur le net indiquent le même problème avec VMWare. La même solution est préconisée

  11. #11
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 132
    Points
    15 132
    Par défaut
    Yep !
    Citation Envoyé par Papy214 Voir le message
    (...) Précision: différents post sur le net indiquent le même problème avec VMWare. La même solution est préconisée
    Si tu pouvais retrouver les liens, ça serait cool, car je n'ai rien trouvé...

    Et effectivement, j'arrive bien à poster un message asynchrone pour faire afficher ma seconde form, mais ça ne change rien au problème de ce foutu pointeur qui ne veut pas bouger.

    Pour tester hors VM, 2 lignes de code dans Lazarus et ça roule tip-top !

    Une dernière piste serait d'envoyer des messages de déplacement de souris (puisqu'au final c'est de ça qu'il s'agit) à la VM, comme si je bougeais le mulot : une idée ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 126
    Points
    13 126
    Par défaut
    Le problème est que tu veux faire exactement la même chose que la machine virtuelle qui ne fait finalement rien d'autre que récupérer les événements "locaux" pour les simuler dans la VM.

    Je pense que seul un hook pourrait permettre un tri et ne laisser passer que certaines informations, par exemple en ajoutant un ExtraInfo dans Mouse_Event.

  13. #13
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 132
    Points
    15 132
    Par défaut Euréka !
    Merci pour ces précisions, Hal
    Citation Envoyé par Andnotor Voir le message
    (...) Je pense que seul un hook pourrait permettre un tri et ne laisser passer que certaines informations, par exemple en ajoutant un ExtraInfo dans Mouse_Event.
    Tu aurais des pistes, des tuyaux ?
    J'avoue humblement que ce n'est pas trop ma tasse de thé, ce dont tu causes ; et je ne pensais pas partir dans une telle galère

    Edit du soir : j'ai eu une idée !

    Puisque le problème vient de l'environnement virtualisé, c'est sur lui qu'il faut agir.

    J'ai dit ce matin qu'en deux lignes de Lazarus je mettais le pointeur où je voulais dans le host.

    Donc faut que je mette ce foutu pointeur là où je veux dans la VM à partir du host, CQFD.

    Comment ? Avec un programme écrit avec Lazarus, qui tourne sous Linux en tâche de fond et surveille un fichier dans un dossier partagé (si y a mieux, ne pas hésiter à poster, mais le host est sous Debian 32 bits).
    Le fichier en question est managé dans la VM par l'apparition de la fenêtre où je veux bouger mon pointeur, mais c'est l'exe dans le host qui va le faire

    Ou alors, peut-être bien passer par le presse-papier, le mode "texte" fonctionne bien, ça pourrait le faire, hé hé hé !

    Car ces histoires de hook, c'est pour intervenir entre des processus qui tournent dans le même OS et, si j'ai bien compris vos remarques et mes tests, ce n'est pas le cas ici.

    Au plaisir de vous lire...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  14. #14
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 132
    Points
    15 132
    Par défaut
    Yep !

    Je me cite :
    Citation Envoyé par Jipété Voir le message
    (...) Ou alors, peut-être bien passer par le presse-papier, le mode "texte" fonctionne bien, ça pourrait le faire, hé hé hé !
    Un peu mon neveu que ça fonctionne bien

    Même pas besoin d'utiliser un fichier, j'ai monté mes deux applis en client-serveur, , elles causent à travers le presse-papier en mode texte avec des flags d'identification et voilà

    J'ai mon curseur qui est enfin mis où je veux, que du bonheur

    Bonne journée, merci pour les pistes.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/06/2015, 07h52
  2. Menu ne s'affiche plus après clic droit (menu contextuel)
    Par lepieux dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 14/08/2013, 01h41
  3. Lancer une commande DOS après clic droit sur dossier
    Par Invité(e) dans le forum Windows
    Réponses: 3
    Dernier message: 17/01/2011, 00h27
  4. Réponses: 1
    Dernier message: 29/11/2010, 23h45
  5. [JTable] Simuler clic gauche après clic droit
    Par Oliveuh dans le forum Composants
    Réponses: 1
    Dernier message: 03/12/2004, 12h35

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