Comment Marche un sendmessage ?

Résolu
Cpcdos Messages postés 425 Date d'inscription samedi 11 juillet 2009 Statut Membre Dernière intervention 28 octobre 2016 - 27 août 2010 à 21:25
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 28 août 2010 à 23:25
Je voudrais savoir comment fonctionne le 'sendmessage'

ex: pour réduire / restaurer / et fermer paint.exe

j'ai vu sur les site mé je comprend rien

6 réponses

Chouchensb Messages postés 64 Date d'inscription jeudi 3 mars 2005 Statut Membre Dernière intervention 2 septembre 2010 1
28 août 2010 à 00:35
Bonjour,

Je découvre moi aussi depuis un mois la fonction qu'est SendMessage, et je galère encore. Je comprend donc ton désarroi, et je vais essayer de te donner quelques pistes (du moins sur ce que j'ai réussi ou croit avoir réussi à comprendre)

* SendMessage est une API WIN32 *

Alors SendMessage est une API WIN32 fournie par Windows.
Mais Une API, c'est quoi ? Eh bien ca veut dire "Application Programming Interface": c'est la boite à outils fournie par Microsoft pour programmer Windows, et ça désigne tout un tas de fonctions contenus dans divers dll (user32.dll, kernell32.dll, etc. ? une dll, c'est juste un fichier qui contient des fonctions ou des routines et qui est partagé et accessible à tous les programmes). SendMessage, c'est dans user32.dll.

Pour plus d'infos sur les différentes dll, tu peux aller voir:
http://en.wikipedia.org/wiki/Api

Pour utiliser une API, il faut d'abord commencer par la déclarer, tout comme on déclare une variable: il faut dire au programme d'où elle vient (user32.dll) et quels sont les paramètres à passer. Donc il faut insérer une ligne du style:

Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long

Pour savoir comment déclarer les API, va voir le site:
http://allapi.mentalis.org/apilist/s.shtml

* SendMessage sert à envoyer des messages ! *

SendMessage sert à envoyer des messages Windows. Mais un message Windows, c'est quoi ? Et bien (de ce que j'ai vaguement compris), quand tu cliques avec la souris sur un bouton d'une interface, Windows envoie un message à l'interface lui disant "Eh! La souris vient de cliquer sur ton bouton!". Puis l'interface envoie à son tour un message au programme lui disant "Eh! On vient de cliquer sur mon bouton, il faudrait activer le code correspondant !" etc. etc.
Bref, entre la souris, le clavier, les interfaces graphiques et le code pur, tout est géré par l'envoi de messages, et tous ces messages sont gérés par Windows. Donc à l'aide de la super boite à outil fournie par windows (les API), on peut intercepter ces messages (c'est la technique de hooking/subclassing : http://en.wikipedia.org/wiki/Hooking) ou générer des messages « artificiels » pour envoyer des instructions à des programmes tiers (c'est ce que tu veux faire en réduisant/restaurant et fermant paint).

* Et où est ce que je trouve de l'aide ? *

A ce sujet, il y a un très bon tutoriel d'introduction sur vbFrance ici (c'est celui avec lequel j'ai commencé):
http://www.vbfrance.com/codes/COURS-PILOTAGE-APPLICATIONS_51165.aspx

Après, il faut s'aider de l'aide de Microsoft sur la MSDN. Parmi les plus utiles, il y a :
* Sendmessage
http://msdn.microsoft.com/en-us/library/ms644950(VS.85).aspx
* SendDlgItemMessage
http://msdn.microsoft.com/en-us/library/ms645515(VS.85).aspx
* FindWIndow
http://msdn.microsoft.com/en-us/library/ms633499(VS.85).aspx

Et bien sûr, la liste de tous les messages Windows :
http://msdn.microsoft.com/en-us/library/ms644927(v=VS.85).aspx#system_defined

De ce que tu dois retenir dans les paramètres de Sendmessage/ SendDlgItemMessage:
* Le handle d'une fenêtre, c'est un numéro attribué dynamiquement à une fenêtre lors de sa création ? C4est donc un nombre qui change constamment et qu'il faut trouver à l'aide d'une fonction telle que FindWIndow
* Le Control ID d'un élément, c'est un nombre figé attribué à un élément de la fenêtre (bouton, zone de texte, case à cocher, etc.). Il est défini au moment de la compilation du programme et peut se trouver à l'aide d'un logiciel espion (SPy++ fourni dans la suite Visual Studio de Microsoft, Winspector, qui est un vieux freeware, ou AutoIT Window Information, fourni avec le freeware AutoIT)
* Msg, wParam et lParam : le message à envoyer et ses paramètres correspondants ? il faut se référer à la liste des messages sur la MSDN (lien ci-dessus)
Un dernier truc: en règle générale, quand tu passes une chaine de caractères en paramètres, il faut utiliser ByVal devant, sinon ça plante)

* Et un bon bouquin dans tout ça ? *

Si l'Anglais ne te rebutes pas, on m?a recommandé le bouquin écrit par Dan Appleman en 1999 : ça date, on ne le trouve plus que d'occasion, mais il est plutôt instructif et très bien expliqué (et puis d'occasion, c'est toujours moins cher que neuf):
http://www.amazon.com/s/ref=nb_sb_noss'url=search-alias%3Daps&field-keywords=dan+appleman&ih=5_5_0_0_0_0_1_1_0_1.108_74&fsc=6
Voilà, en espérant que ça pourra te donner des idées...
3
Rejoignez-nous