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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    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 : 43
    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
    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 averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    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 : 43
    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
    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 averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    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 régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 12
    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

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