Petit coups de pouce sur SendMessage [Résolu]

Signaler
Messages postés
167
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
13 avril 2007
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
Salut,


Malgré toutes les infos que j'ai trouvé ici et là, des choses me
manquent pour utiliser correctement SendMessage(..) de user32.dll.

Depuis mon programme en C#, je souhaite "simuler" la pression de la
touche F5 vers une application externe dont je réussi à identifier le
handle. Voilà où j'en suis au niveau de mon source.... J'ai bon ?? lol



using System;

using System.Runtime.InteropServices;

using ...;



[...]

[DllImport("user32.dll", EntryPoint="FindWindowEx")]

public static extern int FindWindowEx (

int
hwndParent, int hwndEnfant, int
lpClasse, string lpTitre);



[DllImport("user32.dll", EntryPoint="SendMessage")]

public static extern int SendMessage (

int hwnd, uint wMsg, int wParam, int lParam);
[...]

//code du bouton suivant qui simule une pression de la touche F5 sur la
fenetre dont le titre est "UNLOAD.SQL - SQLTalk for Windows"

void B_SuivantClick(object sender, System.EventArgs e)

{

int hwnd = FindWindowEx(0, 0, 0, "UNLOAD.SQL - SQLTalk for Windows");

if (hwnd != 0) {

rtb_etapes.Text += hwnd.ToString();





SendMessage(hwnd, WM_KEYDOWN,VK_F5, 0);

System.Threading.Thread.Sleep(100);

SendMessage(hwnd, WM_KEYUP,VK_F5, 0);



}

}



=> Le problème est tout simple : Quelles sont les valeurs que
doivent prendre "WM_KEYDOWN" et de "VK_F5" pour que SendMessage
puisse fonctionner ?



Ps : J'ai vu que "Coq" a réussi a trouvé la valeur de WM_LBUTTONDOWN (=
0x0201) pour simuler la pression clic_gauche avec la souris - je ne
sais pas comment il a fait



Un petit coups de pouce serait vraiment sympa !

11 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Salut,

Par exemple pour WM_KEYDOWN :
"Header Declared in Winuser.h", un des fichiers du PlatformSDK.

Tu le trouveras dans ce rep là par défaut si tu utilises VS : C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include

Tu y trouveras :
#define WM_KEYDOWN 0x0100

:-)

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Ah oui, je n'ai pas percuter tout de suite : tu ne dois pas utiliser SendMessage mais PostMessage.

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
167
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
13 avril 2007

Merci beaucoup Coq !



Cela m'a permis d'avancer.. mais mon code ne fonctionne pas



Voilà pourtant ce que j'ai fait... Quelque chose cloche ??



int hwnd = FindWindowEx(0, 0, 0, "UNLOAD.SQL - SQLTalk for Windows");

if (hwnd != 0) {

rtb_etapes.Text += hwnd.ToString();



uint WM_KEYDOWN = 0x0100;

uint WM_KEYUP = 0x101;

int VK_F5 = 0x74;



SendMessage(hwnd, WM_KEYDOWN,VK_F5, 0);

System.Threading.Thread.Sleep(100);

SendMessage(hwnd, WM_KEYUP,VK_F5, 0);



}
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Tu es sur de bien recupérer le bon handle ?

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
problème d'unicode !?
Messages postés
167
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
13 avril 2007

Oui... J'ai utilisé une source sur ce site qui scanne les handles et
cela correspond bien... C'est pour ça que je croyais que c'était mon
code qui clochait.. Mais je vais essayer ce SendMessage sur notepad.exe
pour voir...

dur... lol
Messages postés
167
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
13 avril 2007

Je galère toujours j'ai donc fait un simle test ; simuler la touche F5
qui, sur la fenetre du Bloc note, insère la date et l'heure sous forme
de texte.



void B_TestClick(object sender, System.EventArgs e)

{

int hwnd = FindWindowEx(0, 0, 0, "Sans titre - Bloc-notes");

if (hwnd != 0)



{



uint WM_KEYDOWN = 0x0100;


uint WM_KEYUP
= 0x101;


int VK_F5 =
0x74;




SendMessage(hwnd,
WM_KEYDOWN,VK_F5, 0);



System.Threading.Thread.Sleep(100);


SendMessage(hwnd, WM_KEYUP,VK_F5,
0);



}

}



Là non plus ça ne fonctionne pas... Une idée ??
Messages postés
167
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
13 avril 2007

Effectivement, avec PostMessage c'est tout bon !



Merci beaucoup
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
de rien :-)

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
475
Date d'inscription
jeudi 19 juin 2003
Statut
Membre
Dernière intervention
3 novembre 2008

Punaise, deux ans après, je suis exactement dans la même situation.
Et je viens de changer SendMessage pour PostMessage et ça fonctionne :)
T'es un ange Coq
Mais pourquoi SendMessage ne fonctionne pas?

[:D] @++
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Heu, bonne question, mes compétences en manipulation directe des APIs sont un peu trop légères pour avancer une réponse ^^
Une différence entre les 2 est que PostMessage poste le message dans la file de la cible et retourne immédiatement alors que SendMessage attend que le message aie été traité par la cible.
Enfin, en général, je suis la doc, et celle de WM_KEYDOWN dit "The WM_KEYDOWN message is posted to the window".

/*
coq
MVP Visual C#
CoqBlog
*/