Mise en oeuvre d'une API

cs_jacma Messages postés 54 Date d'inscription vendredi 31 octobre 2003 Statut Membre Dernière intervention 6 septembre 2005 - 4 déc. 2003 à 10:29
cs_yaks Messages postés 3 Date d'inscription lundi 13 août 2007 Statut Membre Dernière intervention 27 mars 2008 - 27 mars 2008 à 17:16
Bonjour
Est-il possible d'utiliser l'API sendMessageByString en C# et dans l'affirmative, comment la mettre en oeuvre (déclaration, appel...). Je l'ai utilisée en VB6, mais là, je découvre, et dans les post traitant des API, je n'ai pas su trouver quelque chose d'exploitable. Les renvois vers des documentations en anglais ne me servent à rien vu mes connaissances plus que sommaires de cette langue .
Voici ce que je faisais en VB6 pour la déclaration...

Public Declare Function sendMessageByString& Lib "user32" _ 
  Alias "SendMessageA" (ByVal hWnd As Long, _ 
  ByVal wMsg As Long, ByVal wParam As Long, _ 
  ByVal lparam As String) 
Public Const LB_SELECTSTRING = &H18C 

...et pour l'appeler
 
txtARechercher = txtRechercher.Text 
entryNum = sendMessageByString(List1.hWnd, _ 
            LB_SELECTSTRING, 0, txtARechercher) 

Merci.

9 réponses

gg00xiv Messages postés 656 Date d'inscription mercredi 22 août 2001 Statut Membre Dernière intervention 11 mars 2005 13
4 déc. 2003 à 17:53
Ta declaration ne me semble pas correcte ... ta fonction na pas de type de retour, mais bon, je v supposer que c un entier.

[DllImport("user32.dll")]
public static extern int SendMessageA(int hWnd, int wMsg, int wParam, string lparam);


et pour lappeler, selon ton exemple :

SendMessageA(list1.hWnd,LB_SELECTSTRING,0,txtARechercher.Text);


[Membre du laboratoire .NET de SUPINFO]
0
cs_jacma Messages postés 54 Date d'inscription vendredi 31 octobre 2003 Statut Membre Dernière intervention 6 septembre 2005
4 déc. 2003 à 18:29
Merci de ta réponse. L'API que j'ai montrée est sous VB6, et il me semble me rappeler que c'est le "ByString" de "sendMessageByString" qui définit le type. Ceci étant, cimme c'est donc un sting, je n'auarais qu'à remplacer...
"[C# Erreur] Rechercher.cs(24): Le type ou le nom d'espace de noms 'DllImport' est introuvable (une directive using ou une référence d'assembly est-elle manquante ?)".
J'ai déclaré la Dll au niveau classe de la form.
0
stegars Messages postés 24 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 25 février 2004 2
4 déc. 2003 à 19:52
[System.Runtime.InteropServices.DllImport(user.dll)]


Stegars
0
stegars Messages postés 24 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 25 février 2004 2
4 déc. 2003 à 19:53
oups j'ai mal nommé la dll User32.dll

désolé...

Stegars
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_jacma Messages postés 54 Date d'inscription vendredi 31 octobre 2003 Statut Membre Dernière intervention 6 septembre 2005
4 déc. 2003 à 20:20
Merci
J'ai été voir de plus près ce que j'avais fait. En fait, a valeur de retour est bien un long, mais cela n'a pas d'importance, car cela sert uniquement à pouvoir appeler l'API et on ne s'en sert pas par ailleurs.
J'ai déclaré
using System.Runtime.InteropServices;
, ce qui a résolu le problème d'accès à la Dll.
J'ai aussi déclaré:
[DllImport("user32.dll")]
public static extern int SendMessageA
(int hWnd, int wMsg, int wParam, string lparam);
public const LB_SELECTSTRING = &H18C;
...et là, il n'aime pas: il demande un identificateur pour la constante LB_SELECTSTRING. Dans l'appel de la dll qui suit,
private void txtChercher_Change()
{
    string strRechercher = txtChercher.Text;
    long entryNum = SendMessageA(lstMyListe.hWnd, LB_SELECTSTRING,0,txtChercher.Text);
}
j'ai bien essayé de remplacer la constante par sa valeur mais, il n'a pas aimé non plus. Bref, je galère.
Je précise, au cas où l'utilité de tout cela ne serait pas clair (cela ne le serait pas pour moi) que c'est destiné à sélectionner la première occurence d'item(s) commençant par ce qui est saisi dans la TextBox.
0
cs_jacma Messages postés 54 Date d'inscription vendredi 31 octobre 2003 Statut Membre Dernière intervention 6 septembre 2005
6 déc. 2003 à 12:55
Bonjour
J'ai enfin pu arriver à faire fonctionner l'API SendMessage. Merci à tous ceux qui m'ont aidé, à travers différents messages tous relatif à ce problème. Voici ce que je fait.

D'abord, déclarer:
using System.Runtime.InteropServices;

Puis, pour la déclaration:
[DllImport("user32.dll")]
public static extern int SendMessageA (int hWnd, int wMsg, int wParam, string lparam);
public const int LB_SELECTSTRING = 0x18C;

Pour l'appel:
private void txtChercher_Change(object sender, System.EventArgs e)
{
    string strRechercher = txtChercher.Text;
    long entryNum = SendMessageA(lstMyList.Handle.ToInt32(), LB_SELECTSTRING, 0, strRechercher);
}

Donc, en fin de compte, c'est facile... quand on sait. Les problèmes portaient sur la syntaxe de la valeur hexadécimale de LB_SELECTSTRING (&H18C => 0x18C) et sur la valeur du handle de la ListBox (lstMyList.hWnd => lstMyList.Handle.ToInt32()).
0
cs_yaks Messages postés 3 Date d'inscription lundi 13 août 2007 Statut Membre Dernière intervention 27 mars 2008
27 mars 2008 à 17:12
Bonjour,

Je programme en VB .NET. J'aimerais utiliser la même procédure. Mais j'ai ce message qui me bloque: "SendMessageByString' a déséquilibré la pile. Cela peut se produire, car la signature PInvoke managée ne correspond pas à la signature cible non managée. Vérifiez que la convention d'appel et les paramètres de la signature PInvoke correspondent à la signature non managée cible."

Voici une partie de mon code:

Declare
Function SendMessageByString
Lib
"user32"
Alias
"SendMessageA" _(

ByVal hwnd
As
Long,
ByVal wMsg
As
Long,
ByVal wParam
As
Long,
ByVal lParam
As
String)
As
Long

Public
Const LB_SELECTSTRING = &H18C

Private
Sub txtARechercher_TextChanged(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles txtARechercher.TextChanged

Dim entryNum
As
Long

Dim txtRechercher
As
StringtxtRechercher = txtARechercher.Text

entryNum = SendMessageByString(ListImmo.Handle.ToInt32, LB_SELECTSTRING, 0, txtRechercher)

End
Sub

Quelqu'un peut-il m'aider?? Merci..
0
cs_yaks Messages postés 3 Date d'inscription lundi 13 août 2007 Statut Membre Dernière intervention 27 mars 2008
27 mars 2008 à 17:14
Bonjour,

Je programme en VB .NET. J'aimerais utiliser la même procédure. Mais j'ai ce message qui me bloque: "SendMessageByString' a déséquilibré la pile. Cela peut se produire, car la signature PInvoke managée ne correspond pas à la signature cible non managée. Vérifiez que la convention d'appel et les paramètres de la signature PInvoke correspondent à la signature non managée cible."

Voici une partie de mon code:

Declare
Function SendMessageByString
Lib
"user32"
Alias
"SendMessageA" _(

ByVal hwnd
As
Long,
ByVal wMsg
As
Long,
ByVal wParam
As
Long,
ByVal lParam
As
String)
As
Long

Public
Const LB_SELECTSTRING = &H18C

Private
Sub txtARechercher_TextChanged(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles txtARechercher.TextChanged

Dim entryNum
As
Long

Dim txtRechercher
As
StringtxtRechercher = txtARechercher.Text

entryNum = SendMessageByString(ListImmo.Handle.ToInt32, LB_SELECTSTRING, 0, txtRechercher)

End
Sub

Quelqu'un peut-il m'aider?? Merci..
0
cs_yaks Messages postés 3 Date d'inscription lundi 13 août 2007 Statut Membre Dernière intervention 27 mars 2008
27 mars 2008 à 17:16
Bonjour,

Je programme en VB .NET. J'aimerais utiliser la même procédure. Mais j'ai ce message qui me bloque: "SendMessageByString' a déséquilibré la pile. Cela peut se produire, car la signature PInvoke managée ne correspond pas à la signature cible non managée. Vérifiez que la convention d'appel et les paramètres de la signature PInvoke correspondent à la signature non managée cible."

Voici une partie de mon code:

Declare
Function SendMessageByString
Lib
"user32"
Alias
"SendMessageA" _(

ByVal hwnd
As
Long,
ByVal wMsg
As
Long,
ByVal wParam
As
Long,
ByVal lParam
As
String)
As
Long

Public
Const LB_SELECTSTRING = &H18C

Private
Sub txtARechercher_TextChanged(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles txtARechercher.TextChanged

Dim entryNum
As
Long

Dim txtRechercher
As
StringtxtRechercher = txtARechercher.Text

entryNum = SendMessageByString(ListImmo.Handle.ToInt32, LB_SELECTSTRING, 0, txtRechercher)

End
Sub

Quelqu'un peut-il m'aider?? Merci..
0
Rejoignez-nous