madkeyboard
Messages postés100Date d'inscriptionmercredi 27 avril 2011StatutMembreDernière intervention21 décembre 2012
-
10 avril 2012 à 11:01
madkeyboard
Messages postés100Date d'inscriptionmercredi 27 avril 2011StatutMembreDernière intervention21 décembre 2012
-
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...).
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.???)
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).
madkeyboard
Messages postés100Date d'inscriptionmercredi 27 avril 2011StatutMembreDernière intervention21 décembre 20121 13 avril 2012 à 12:01
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é ?