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

C# Discussion :

[c#] Position en pixel du caret


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Points : 23
    Points
    23
    Par défaut [c#] Position en pixel du caret
    Bonjour a tous.
    Je développe actuellement un application Winform et je souhaite récupérer la position en pixel du caret sur une application tiers (word, firefox, notepad...).
    J'ai déjà eut des indications et des parties de code, mais je ne suis pas certain du résultat.
    Voici mon code de test sur un projet console en c# :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    class Program
        {
            #region imporation de dll
            [ DllImport( "user32.dll" ) ]
            private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam );
     
            [ DllImport( "user32.dll", SetLastError = true, CharSet = CharSet.Unicode ) ]
            private static extern IntPtr FindWindowEx( IntPtr hwndParent,IntPtr hwndChildAfter, string lpszClass, string lpszWindow );
     
     
            [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
            public static extern IntPtr GetForegroundWindow();
     
     
            [DllImport("user32.dll", SetLastError = true)]
            public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
     
            #endregion
     
            private const int EM_GETSEL = 0xB0;
            static unsafe void Main(string[] args)
            {
                ThreadStart delegue = new ThreadStart (thread);
                Thread monThread = new Thread (delegue);
                Console.Write("Debut du thread dans 5 secondes.\n");
                Thread.Sleep(5000);
                monThread.Start();
                Console.Read();
     
            }
     
            static unsafe void thread()
            {
                Process saveProcessCurrent = new Process();
                IntPtr idFocus;
     
                //on récupère l'id du handler qui à le processus
                while (true)
                {
                    idFocus = GetForegroundWindow();
                    uint pid;
                    //on récupère l'id du processus qui possede ce handler
                    GetWindowThreadProcessId(idFocus, out pid);
     
                    Console.WriteLine("IdFocus : " + idFocus + "      " + "\nPID : " + pid + "\n");
                    IntPtr hWnd = (IntPtr)(pid);
                      if (hWnd != IntPtr.Zero)
                        {
                            int start;
                            int end;
                            SendMessage(hWnd, EM_GETSEL, (IntPtr)(&start), (IntPtr)(&end));
                            Console.WriteLine("Point : " + start + " ; " + end + "\n");
                        }
                        else
                            Console.WriteLine(" La fonction GetWindowThreadProcessId(idFocus, out pid) a raté.");
     
                    Console.Write("\n /************************************/\n\n");
                    Thread.Sleep(2000);
     
                }
            }
          }
    Donc j'ai créé un thread qui récupère le pid du processus courant, qui ensuite lui envoie un message afin de récupérer deux IntPtr, en lieu et place de deux WPARAM pour me les afficher ensuite.
    Seulement, les valeurs ref (start et end) me donnent des valeur que je ne peux pas utiliser pour mon application, et qui, ne peuvent pas mettre a jour une instance de type Point.
    Ensuite, malgré mes recherches, je n'ai rien trouvé concernant ce type WPARAM, sauf que c'est un type opaque et je ne sais pas ce que cela représente au sein de l'API.
    Si quelqu'un a un indice, une solution ou autre chose pour m'aider a résoudre ce problème, je vous en remercie.
    Si mes explications ne sont pas assez claires, demandez moi je suis a votre disposition.
    Amicalement.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    tu mélanges plusieurs choses... pid est un identifiant de processus, et tu l'utilises comme un handle de fenêtre. Cette instruction n'a donc pas de sens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IntPtr hWnd = (IntPtr)(pid);
    Tu as déjà un handle de fenêtre qui est idFocus. Je ne sais pas trop pourquoi tu as besoin du PID...

    D'autre part, tu envoies le message EM_GETSEL à la fenêtre, alors qu'il faudrait l'envoyer au contrôle qui a le focus... et pour récupérer ça je sais pas trop comment on fait

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    C'est pas grave si tu ne sais pas c'est déjà une piste que tu me donne. A moi maintenant d'aller dans ce sens pour voir si ça peut marcher.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IntPtr hWnd = (IntPtr)(pid);
    pour ce qui est de cette partie de code, je pensais qu'il fallait utiliser le pid plutôt que le handle. je pense qu'en l'utilisant ça ira dans le sens de ta dernière remarque et que j'aurais quelque chose de plutôt pas mal
    En tout cas merci déjà pour ces info.
    Aurais-tu un lien par hasard qui expliquerais le type WPARAM ? je me galère a chercher car si je récupère un paramètre de ce type, il faudra sans doute créer un algo pour traiter ce paramètre.


    J'ai réalisé des test avec la solution déjà que tu m'as donné et je voulais simplement dire que les résultats sont assez aléatoire. je sais pas si tu as fais un copier collé de mon code pour le tester mais en tout cas je trouve les résultats aléatoires. je cherche néanmoins la solution, c'était juste pour prévenir de me résultats.

    J'aimerais savoir pour finir si j'ai pas un moyen d'intégrer par exemple une morceau de c ou de c++. Le c et le c++ peuvent offrir un développement de plus bas niveau pour attaquer plus en profondeur l'API.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par ShamSS Voir le message
    Aurais-tu un lien par hasard qui expliquerais le type WPARAM
    WPARAM est un paramètre de la méthode SendMessage. C'est juste un synonyme pour UINT_PTR, donc en gros c'est un entier non signé sur 32 bits (uint en C#). Sa signification change selon le message. Pour EM_GETSEL :
    http://msdn.microsoft.com/en-us/library/bb761598.aspx


    Citation Envoyé par ShamSS Voir le message
    J'ai réalisé des test avec la solution déjà que tu m'as donné et je voulais simplement dire que les résultats sont assez aléatoire. je sais pas si tu as fais un copier collé de mon code pour le tester mais en tout cas je trouve les résultats aléatoires. je cherche néanmoins la solution, c'était juste pour prévenir de me résultats.
    Ben c'est ce que je te disais, il faut envoyer le message EM_GETSEL au contrôle qui a le focus, pas à la fenêtre... la difficulté c'est d'obtenir un handle sur ce contrôle

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    Enfaite si je veux obtenir ce handle il faut que j'attaque en profondeur l'API...
    Le truc c'est que l'application sur laquelle je veux récupérer ces "données" possède la main sur le l'application qui la demande, c'est au moment ou je tape des lettre que je doit ouvrir une petite fenêtre pour afficher des info ou une auto-complétion au niveau du caret.
    peut-être que ces indications vont aider je suis désolé de pas en avoir parlé plus tôt.

    il faudrait que j'utilise une partie de code c ou c++ dans mon code c# mais c'est sans doute pas possible.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 12
    Points : 16
    Points
    16
    Par défaut
    Bonsoir,

    désolé d'intervenir dans cette discussion alors que je n'ai rien à apporter, mais si jamais tu arrives à obtenir ce que tu veux, je serais curieux de voir comment faire et donc ca serait cool que tu postes la "solution"

    Merci d'avance

  7. #7
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    Oui pas de soucie

  8. #8
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    Bonjour.
    je compte utiliser une dll en C pour régler mon problème mais je sais pas si une dll avec une fonction qui récupère ma position de caret est déjà créé ou pas.
    J'aimerais avoir votre avis sur cette question.
    Merci d'avance

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    en fait je viens d'avoir une inspiration soudaine... j'ai cherché "GetCaret" dans l'index de la doc MSDN, et je suis tombé sur cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BOOL GetCaretPos(
                      LPPOINT lpPoint
    );
    Citation Envoyé par MSDN
    The GetCaretPos function copies the caret's position to the specified POINT structure.
    ...
    The caret position is always given in the client coordinates of the window that contains the caret.
    Donc tu dois pouvoir faire un truc comme ça :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    [StructLayout(LayoutKind.Sequential)]
    struct POINT
    {
        public int x;
        public int y;
    }
     
    [StructLayout(LayoutKind.Sequential)]
    struct RECT
    {
        public int left;
        public int top;
        public int right;
        public int bottom;
    }
     
    [DllImport("user32.dll")]
    static extern bool GetCaretPos(out POINT point);
    [DllImport("user32.dll")]
    static extern IntPtr GetFocus();
    [DllImport("user32.dll")]
    static extern bool GetWindowRect(IntPtr hWnd, out RECT rect);
    ...
     
    // position du caret par rapport à la fenêtre active
    POINT caretPosRelative = null;
    GetCaretPos(out caretPos);
     
    // position de la fenêtre active
    IntPtr focusedWindow = GetFocus();
    RECT focusedWindowRect = null;
    GetWindowRect(focusedWindow, focusedWindowRect);
     
    // conversion des coordonnées du caret en absolu
    int xCaret = focusedWindowRect.left + caretPos.x;
    int yCaret = focusedWindowRect.top + caretPos.y;
    System.Drawing.Point caretPosAbsolute = new System.Drawing.Point(xCaret, yCaret);
    y a sûrement quelques corrections à faire, mais l'idée est là...

  10. #10
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    Citation:
    Envoyé par MSDN
    The GetCaretPos function copies the caret's position to the specified POINT structure.
    ...
    The caret position is always given in the client coordinates of the window that contains the caret.
    Alors j'ai deja testé le getCaretPos. voici le code que j'avais compilé lors de mon test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private void AfficherPopup()
            {
                Point point = new Point();
                bool test = true;
                test = GetCaretPos(out point);
                Point startPoint = new Point();
                startPoint = PointToScreen(point);
     
                forme.Location = startPoint;
                forme.Show();
            }
    La méthode PointToScreen recalcule la coordonné du caret selon le coin en haut a gauche de l'écran.
    Je n'ai pas mis les dll dans le code affiché par souci de lisibilité mais elles y sont dans mon projet
    Seulement, cela ne marche QUE sur les textEdit de la même application.
    En gros je créé un projet winForm dans lequel je créé un Textbox, je met ce code pour trouver la position du caret selon l'écran et ça marche.
    Pour les application "externes" c'est une autre histoire. il faudrait utiliser le handle ou le pid du programme dans la fonction getCaretPos afin de lui dire dans quel application il doit allez chercher le caret. Seulement, il n'y a pas de surcharge pour ça.
    Donc enfaite l'algorithme de ton code est bon (j'ai fais a peut prés la même chose sauf que j'affiche directement une nouvel form) mais cela ne marche pas sur les applications extérieurs.
    En tout cas merci de t'être penché sur mon problème et c'est claire que ça aurait pu marcher

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 12
    Points : 16
    Points
    16
    Par défaut
    Simple hypothèse : est-ce que le fait de mettre ce code d'obtention du caret dans une DLL écrite en C, chargée plus bas niveau (comme pour les hook) permettrait d'avoir une vue d'"ensemble" et de récupérer le caret de la fenêtre active ???

  12. #12
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    Bib73
    Simple hypothèse : est-ce que le fait de mettre ce code d'obtention du caret dans une DLL écrite en C, chargée plus bas niveau (comme pour les hook) permettrait d'avoir une vue d'"ensemble" et de récupérer le caret de la fenêtre active ???
    c'est justement ce que je pense, le C est est d'un niveau tellement bas par rapport au c# que l'ont peux presque faire ce que l'on veux que ce soit au niveau système ou matériel.

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    D'abord, c'est pas une très bonne idée d'utiliser directement System.Drawing.Point en paramètre de GetCaretPos... évidemment, c'est plus pratique, et il se trouve que ça fonctionne parce que Point a juste 2 champs de type int, comme la structure POINT de Windows. Mais qu'est-ce qui te dit que dans une future version de .NET il n'y aura pas des champs supplémentaires (placés avant X et Y, histoire de bien foutre la zone...) ? dans ce cas ça ne fonctionnera plus. Mais bon, le problème n'est pas là a priori

    Citation Envoyé par ShamSS Voir le message
    La méthode PointToScreen recalcule la coordonné du caret selon le coin en haut a gauche de l'écran.
    ...
    Seulement, cela ne marche QUE sur les textEdit de la même application.
    PointToScreen convertit en coordonnées d'écran des coordonnées relatives à la fenêtre courante. Donc en gros ça veut dire que tu traites les coordonnées renvoyées par GetCaretPos comme si elles étaient relatives à ta fenêtre, alors qu'elles sont relatives à une autre fenêtre. C'est pour ça que je n'ai pas utilisé PointToScreen dans le code que je t'ai donné (si j'avais pu l'éviter je me serais pas encombré d'un GetWindowRect...)

    Citation Envoyé par ShamSS Voir le message
    c'est claire que ça aurait pu marcher
    Tout n'est pas encore perdu si tu appliques ce que j'ai dit juste au dessus

    Citation Envoyé par ShamSS Voir le message
    c'est justement ce que je pense, le C est est d'un niveau tellement bas par rapport au c# que l'ont peux presque faire ce que l'on veux que ce soit au niveau système ou matériel.
    Ah, les idées reçues... On peut aussi faire quasiment tout ce qu'on veut en C# (grâce à P/Invoke, au code unsafe, etc). Si tu avais fait ça en C, tu aurais aussi utilisé GetCaretPos et GetWindowRect, donc tu n'aurais pas été plus avancé...

  14. #14
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    tomlev
    Tout n'est pas encore perdu si tu appliques ce que j'ai dit juste au dessus
    Oui c'est vrai tout n'est pas perdu mais j'ai déjà tenté d'intégrer dans mon application la fonction getCaretPos mais sans succès.
    Il faudrait que je reprenne le code de test du premier message pour refaire un test avec getCaretPos mais je vais être honnête c'est sans grande conviction.

    Ah, les idées reçues... On peut aussi faire quasiment tout ce qu'on veut en C# (grâce à P/Invoke, au code unsafe, etc). Si tu avais fait ça en C, tu aurais aussi utilisé GetCaretPos et GetWindowRect, donc tu n'aurais pas été plus avancé...
    Il me semble que le C est beaucoup plus proche de la machine quand même ? Ensuite j'ai pas testé de récupéré la position en C donc je savais pas trop mais pendant mon bts on a souvent codé en C les processus et des driver justement car c'est plus orienté bas niveau que C++ ou c# (surtout c#)
    Je suis encore dans mes études je ne demande qu'a apprendre

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par ShamSS Voir le message
    Oui c'est vrai tout n'est pas perdu mais j'ai déjà tenté d'intégrer dans mon application la fonction getCaretPos mais sans succès.
    Il faudrait que je reprenne le code de test du premier message pour refaire un test avec getCaretPos mais je vais être honnête c'est sans grande conviction.
    Ben tu as essayé avec le code que je t'ai donné dans le post #9 ?

    Citation Envoyé par ShamSS Voir le message
    Il me semble que le C est beaucoup plus proche de la machine quand même ? Ensuite j'ai pas testé de récupéré la position en C donc je savais pas trop mais pendant mon bts on a souvent codé en C les processus et des driver justement car c'est plus orienté bas niveau que C++ ou c# (surtout c#)
    Je suis encore dans mes études je ne demande qu'a apprendre
    Tu peux aussi faire des trucs de bas niveau en C#... Par exemple en appelant des fonctions C via P/invoke, ou en utilisant du code unsafe pour accéder directement à la mémoire. Il y a juste quelques trucs que tu ne peux pas faire en C#, comme les drivers par exemple.

  16. #16
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    C'est vrai que j'ai pas intégré ton code. A vrai dire j'ai vu que ça ne marchais pas ma solution donc je suis passé sur autre chose de beaucoup plus complexe.
    Si tout va bien et que je change juste l'emplacement de la form avec caretPosAbsolute ça devrais passer ?
    En réalité, après ré-étude de ton code, je crois que la fin ben... j'ai du mal a la comprendre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int xCaret = focusedWindowRect.left + caretPos.x;
    int yCaret = focusedWindowRect.top + caretPos.y;
    System.Drawing.Point caretPosAbsolute = new System.Drawing.Point(xCaret, yCaret);
    Les valeurs xCaret et yCaret sont "initialisé" avec quel valeur ? C'est pas une question de lecture mais a quoi ça correspond exactement ? C'est seulement ça que je saisi pas.
    Je viens d'intégrer ton code et il possède des erreur notamment pour le getCaretpos, qui a une valeur de retour que tu ne récupère pas. Voila je voulais te le signaler.
    Après quelques modification, ton code marche. Maintenant je dois encore apporter certaine modif pour qu'il soit parfais, et que ça se mette toujours au bon endroit car j'ai l'impression que c'est encore un peu aléatoire.
    Je dois avouer que le premier échec m'a porté préjudice car il aurais fallu que je continue dans ce sens, ce que je n'ai pas fais.
    En tout cas merci beaucoup

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par ShamSS Voir le message
    Les valeurs xCaret et yCaret sont "initialisé" avec quel valeur ? C'est pas une question de lecture mais a quoi ça correspond exactement ? C'est seulement ça que je saisi pas.
    C'est la position absolue (i.e. en coordonnées écran) du caret : position relative par rapport à la fenêtre + position de la fenêtre

    Citation Envoyé par ShamSS Voir le message
    Je viens d'intégrer ton code et il possède des erreur notamment pour le getCaretpos, qui a une valeur de retour que tu ne récupère pas. Voila je voulais te le signaler.
    C'est exact... j'ai écrit ça un peu à l'arrache
    Idéalement il faudrait vérifier la valeur de retour : 0 => échec, sinon succès
    (idem pour GetWindowRect)

  18. #18
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    Bon j'ai vraiment intégré le code en essayant de régler certains problèmes.
    Par contre, en utilisant le débuggeur, je me suis aperçu que la position par rapport a la fenêtre active est 0. Normal me diras-tu cr le caret est situé dans le coin supérieure gauche du notepad. seulement, mon affichage ne se fais qu'a partir du second caractère saisie, doc il ne devrais pas être a 0. Ensuite, la position de la fenêtre active n'est pas la bonne je ne sais pas si c'est réellement en pixel, car quand j'ai 150 en x par exemple et 145 en y, je n'ouvre pas ma form a coté de mon caret mais quasiment dans le coin supérieure gauche.
    J'ai l'impression que mes coordonnées sont sous une autre forme que des coordonnées en pixel. j'ai cherché dans la doc et je n'ai rien trouvé à ce sujet. je continue mes recherche et je te met ma fonction de test pour que tu puisse l'analyser si tu le souhaite.
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    private Point TrouverPoint()
            {
     
                // position du caret par rapport à la fenêtre active
                //POINT caretPosRelative ;
                POINT caretPos ;
                bool test = true;
                test = GetCaretPos(out caretPos);
     
                if (test == false)
                {
                    //Affichage de l'erreure
                }
                else
                {
                    // position de la fenêtre active
                    IntPtr focusedWindow = GetFocus();
                    RECT focusedWindowRect;
                    test = GetWindowRect(focusedWindow, out focusedWindowRect);
     
                    if (test == false)
                    {
                        //Affichage de l'erreur
                    }
                    else
                    {
                        // conversion des coordonnées du caret en absolu
                        int xCaret = focusedWindowRect.left + caretPos.x;
                        int yCaret = focusedWindowRect.top + caretPos.y;
                        Point caretPosAbsolute = new Point(xCaret, yCaret);
                        return caretPosAbsolute;
                    }
                }
                Point nullPoint = new Point();
                return nullPoint;
     
            }
    C'est du code sortie d'un projet WinForm.

    Si tu as une suggestion ou une autre piste quelle qu'elle soit, n'hésite pas
    Bon au final c'est de ma faute si le problème des coordonnées est la. En effet j'ai placé cette fonction après que la fenêtre que je veux placer a coté du caret ai été activé. donc la fenêtre active c'est elle... J'ai donc modifié et placé avant l'appel de la fonction Show() et désormais, j'ai un problème avec la récuperation de l'emplacement de la fenêtre active. le booléen est donc a false, donc elle ne marche pas cette fonction.
    En tout cas je tiens a dire que nous sommes pas loin de la solution

  19. #19
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Toutes les coordonnées renvoyées par l'API Win32 sont en pixels

    Mais si tu exécutes le programme pas à pas en debug, la fenêtre active est celle de Visual Studio...

  20. #20
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    logique...
    J'ai édité le message précédent.
    Donc si je te suit scrupuleusement, je devrais avoir les bonnes coordonnée. Mais non je les ai pas...
    de plus, la fonction getfocus() me renvoie 0 comme handle donc ça me fais "planter" mon programme (il marche encore mais sans les coordonné de la fenêtre active donc).
    Plutôt que d'utiliser la fonction getFocus() je pourrais pas utiliser la fonction GetWindowThreadProcessId() ?

Discussions similaires

  1. Obtenir la position en pixel d'un JButton dans une JToolBar
    Par carlierd dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 27/08/2007, 14h45
  2. Détection de position de pixel
    Par ranell dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 23/05/2007, 11h00
  3. position de pixel d'une valeur donnée
    Par zappa37 dans le forum Calcul scientifique
    Réponses: 3
    Dernier message: 07/03/2007, 08h26
  4. Position en pixel du curseur dans un TextBox
    Par nihaoma dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/02/2007, 13h51
  5. Recuperer la position en pixel d'un <td>
    Par Olaf MENJI dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 20/12/2005, 10h06

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