Aide sendmessage [Résolu]

madkeyboard 100 Messages postés mercredi 27 avril 2011Date d'inscription 21 décembre 2012 Dernière intervention - 10 avril 2012 à 11:01 - Dernière réponse : madkeyboard 100 Messages postés mercredi 27 avril 2011Date d'inscription 21 décembre 2012 Dernière intervention
- 10 oct. 2012 à 12:36
Bonjour à tous !

Encore un topic d'aide pour le fameux sendmessage...
Mon problème est assez généraliste : j'ai eu a plusieurs occasions besoin d'utiliser les sendmessage, j'ai toujours fait un peu de la bricole pour m'en sortir, en fouillant différents topic...

Voilà donc mon souci : je cherche un endroits (ou du moins un site web ^^) où serait récapitulé tous les messages utilisables par le sendmessage (ça fait peut-être beaucoup de messages, je ne me rend pas bien compte !), et si possible dans un site où l'ou puisse faire une recherche !

Mon souci est que dans quasi TOUS les topics parlant de sendmessage, toutes les réponses donnent des exemples avec les messages utilisés sous forme d'énumération (selon coq dans ce post : "http://www.csharpfr.com/forum/sujet-PETIT-COUPS-POUCE-SUR-SENDMESSAGE_512235.aspx", il semble que l'on puisse trouver des définitions dans certains header, par exemple "Winuser.h", que j'ai trouvé à coup de recherche windaube XP, mais que je suis bien incapable d'utiliser en csharp !!! Mais je doute que tout soit regroupé dans le même fichier...).

Mon exemple du moment : je doit lire une "listbox" (que j'ai identifié avec spy++).
J'ai trouvé ça :
http://www.cppfrance.com/forum/sujet-LISTBOX-RECUPERATION-CONTENUE-SELECTION-MULTIPLE_1390617.aspx

C'est très bien, mais les commandes du genre "SendMessage(hlb, LB_GETCOUNT, 0, 0)", ça ne m'aide malheureusement pas du tout...
D'autant que msdn nous donne ceci : http://msdn.microsoft.com/en-us/library/ms930102.aspx, en 1 mot : rien...


Bref, je radote pas mal, veuillez m'excuser ! J'espère que quelqu'un pourra m'indiquer un site ou je puisse retrouver les valeurs en hexa des énumérations que tout le monde utilise comme allant de soit dans les SendMessage !! Ou à la limite un moyen d'utiliser ces énumérations "telles quelles" (using System.???)

Merci d'avance ^^
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
madkeyboard 100 Messages postés mercredi 27 avril 2011Date d'inscription 21 décembre 2012 Dernière intervention - 10 oct. 2012 à 12:36
3
Merci
Bonjour à ceux qui passent par là !

Je reviens sur ce vieux topic, parce que j'ai eu la réponse à mes 2 questions, depuis le temps ^^
Primo, pour la liste des messages :
http://msdn.microsoft.com/fr-fr/library/ms644927.aspx#system_defined

Il y a là une liste très exaustive (msdn oblige), et plutôt bien rangée. Faut fouiller un peu, mais on s'en sort !
A savoir, la grande majorité des messages dont on se sert se trouvent à la ligne "WM" ; "Général".


Sinon, si d'autres bloquent sur le même genre de code que moi, pour lire dans une listBox, il faut s'y prendre ainsi :

//En haut de ma classe :
const int LB_GETCOUNT = 0x018B;
const int LB_GETSELCOUNT = 0x0190;       //Non utilisé
const int LB_GETSEL = 0x0187;            //Non utilisé
const int LB_SETSEL = 0x0185;            //Non utilisé
const int LB_GETTEXT = 0x0189;
const int LB_GETTEXTLEN = 0x018A;


//Plus bas, dans la méthode concernée :
iNbLignes = SendMessage(iProcHandleElementFenetre, LB_GETCOUNT, 0, 0);

iTxtLenght = SendMessage(iProcHandleElementFenetre, LB_GETTEXTLEN, iNbLignes - 1, 0);

stTxtFinListBox = new StringBuilder(iTxtLenght);
SendMessage(iProcHandleElementFenetre, LB_GETTEXT, iNbLignes - 1, stTxtFinListBox);

Ici, je cherche à lire la dernière ligne (iNbLignes - 1). Si vous ne connaissez pas le nombre de lignes exacte, il est bon de le récupérer ("LB_GETCOUNT").
Sinon, le numéro de ligne doit impérativement être un StringBuilder (voir msdn).


Mad Keyboard

Merci madkeyboard 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de madkeyboard
Tupad 239 Messages postés lundi 5 décembre 2005Date d'inscription 27 août 2012 Dernière intervention - 10 avril 2012 à 12:52
0
Merci
J'ai mis la main sur une liste de messages possibles: http://www.autohotkey.com/docs/misc/SendMessageList.htm

Il y a également un tutorial pour en capturer d'autres.
Commenter la réponse de Tupad
madkeyboard 100 Messages postés mercredi 27 avril 2011Date d'inscription 21 décembre 2012 Dernière intervention - 13 avril 2012 à 12:01
0
Merci
Yes, merci Tupad !
Voilà qui couvrira une bonne partie de mes besoins !

Pour le coup, j'ai essayé de reprendre le code dont j'ai parlé plus haut pour lire dans ma listbox, le résultat est pas terrible :s

Voici mon code :

            //Déclarations :

            int iProcHandleFenetrePalpage = 0;
            int iProcHandleElementFenetre = 0;

            int iTxtLenght = 0;
            StringBuilder stTxtFenetre = null;

            const int LB_GETCOUNT = 0x018B;
            const int LB_GETSELCOUNT = 0x0190;
            const int LB_GETSEL = 0x0187;

            int iSonde = 0;


            //Fonction :

                do              //On recherche la fenêtre
                {
                    iProcHandleFenetrePalpage = FindWindowEx(0, 0, 0, "Measuring Job SINUMERIK 840D (File Interface)");
                    Thread.Sleep(50);
                } while (iProcHandleFenetrePalpage == 0);

                iProcHandleFenetrePalpage = FindWindowEx(iProcHandleFenetrePalpage, 0, 0, "Measuring Job SINUMERIK 840D (File Interface)");
                //On doit effectuer cette commande une 2nde fois, car il y a 2 instances de même nom l'une dans l'autre pour cette fenêtre !


                do              //On cherche la "listbox" (objet c++ ?)
                {
                    iProcHandleElementFenetre = FindWindowEx(iProcHandleFenetrePalpage, iProcHandleElementFenetre, 0, null);

                    iTxtLenght = SendMessage(iProcHandleElementFenetre, 0x000E, 0, 0) + 1;
//la commande 14 ou 0xE sert à obtenir la longueur du texte de la fenêtre (ou contrôle) ciblée.
//On ajoute 1 pour prendre en compte le caractère null en fin de chaine de char !

                    stTxtFenetre = new StringBuilder(iTxtLenght);
                    SendMessage(iProcHandleElementFenetre, 0x000D, iTxtLenght, stTxtFenetre);
//La commande 13 ou 0xD sert à obtenir le contenu de la "fenêtre" spécifiée.
//Dans le cas d'une listbox, on récupère une chaine de charactère vide ! (cf condition ci-dessous)

                    if ((stTxtFenetre.ToString() == "") && (iProcHandleElementFenetre != 0))
                    {
                        iSonde = SendMessage(iProcHandleElementFenetre, LB_GETCOUNT, 0, 0);
                        iSonde = SendMessage(iProcHandleElementFenetre, LB_GETSELCOUNT, 0, 0);
                        iSonde = SendMessage(iProcHandleElementFenetre, LB_GETSEL, 10, 0);
                    }

                } while (iProcHandleElementFenetre != 0);


Note : j'ai mis les 3 lignes avec le "iSonde" pour tester ces commandes.
Résultat en mode pas à pas :

LB_GETCOUNT donne 28, ce qui correspond au nombre de ligne de la fenêtre au moment de l'exécution ;
LB_GETSELCOUNT donne -1, ce qui doit, je suppose, correspondre à une erreur ;
LB_GETSEL donne 0, ce qui signifie, je crois, qu'il n'a trouvé aucune selection ? (j'ai mis le 3ème paramètre à 10 au pifomètre conplet !)

Est-ce que quelqu'un serait capable de m'expliquer comment récupérer les selections de la listbox ? Est-ce bien ici les bonnes commandes, et si oui, ou est-ce que je me suis gourré ?

Merci d'avance !
Commenter la réponse de madkeyboard

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.