Item dans une Combobox

JLASopra Messages postés 7 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 26 octobre 2012 - 18 oct. 2012 à 14:28
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 27 oct. 2012 à 08:45
Bonjour,
Je travaille sur une application tiers qui n'est pas de Microsoft.
Etant donné le handle d'une combobox (désigné par hwnd_combo, je le trouve avec une API, pas de pb de ce côté là), je souhaite le parcourir et m'arrêter lorsque l'élément que cette combobox affiche convient.
Pour le parcourir, j'ai l'API relative à la molette de la souris.
Pour lire l'élément affiché dans cette combobox, je ne sais pas faire.
Auriez-vous des indications?
Merci!

8 réponses

Utilisateur anonyme
19 oct. 2012 à 10:57
Bonjour,

Si tu as le handle du combo, tu peux séléctionner l'élement que tu veux avec ComboBox_SelectItemData ou ComboBox_SelectString.


_____________
Kenji
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 oct. 2012 à 11:07
Bonjour,
Ce qui interpelle :
sur une application tiers qui n'est pas de Microsoft

Qu'est-ce qui te permet d'affirmer que ce contrôle répond bien lui-même aux fonctionnalités d'une combobox de Microsoft. Déjà, même pour les comboboxes de MicroSoft, des différences existent entre celles de VB6, par exemple, et celle de Office ! On sait manipuler par exemple celles de VB6 par des fonctions de l'Api de Windows. Ces manipulations ne sont pas les mêmes avec celles de Office (je n'ai par exemple personnellement pas encore trouvé comment les faire).
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
JLASopra Messages postés 7 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 26 octobre 2012
26 oct. 2012 à 17:54
Bonjour à vous deux!

Tout d'abord, merci pour vos réponses puisqu'elles me confirment les résultats de mes recherches.

Mais je dois regretter que cela ne fonctionne pas. Ce que j'ai écrit:
Private 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
...
CB_SELECTSTRING = &H14D
wParam = "FRUIT"
lParam = VarPtr(wParam)
SendMessageByString hwdcombo, CB_SELECTSTRING, -1, wParam
...
End sub

J'ai donc essayé avec la molette de la souris:
SendMessage hwdcombo, WM_MOUSEWHEEL, 0, 0
J'ai pris soin et patience de connaître toutes les options possibles de ce combobox hwdcombo. Bien entendu, par défaut, l'option est: vide. Or, si je réitère l'instruction de la molette autant de fois que nécessaire pour m'arrêter à l'index qui m'intéresse, je suis surpris de voir que à un incrément de l'instruction correspond un saut de 4 indexes dans la liste de choix. J'ai fait mes recherches à propos du fractional MOUSEWHEEL mais, je regrette, je n'y comprends rien . Auriez vous une indication svp?

Par ailleurs, si je peux controler le combo hwdcombo avec les touches UP et DOWN, l'instruction SendMessage hwdcombo, VK_UP, 0, 0 ne fonctionne pas ni avec VK_DOWN:
VK_LEFT = &H25 'LEFT ARROW key
VK_UP = &H26 'UP ARROW key
VK_RIGHT = &H27 'RIGHT ARROW key
VK_DOWN = &H28 'DOWN ARROW key.

Bref, je suis à cours d'idées:
1)hypothèse de control de hwdcombo avec la molette: comment fractionner cet incrément? (je crois mais sans l'avoir confirmé que MOUSWHEEL=120°).

2)hypothèse de contôle de hwdcombo avec les flèches: Faut-il faire un focus sur la fenêtre hwdcombo? Dans ce cas, comment faire? dois-je ensuite faire suivre par SendMessage hwdcombo, VK_UP, 0, 0?

Vous remerciant pour votre attention,

JLASOPRA
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 oct. 2012 à 19:23
Il y a une chose qui m'échappe (ou qui t'échappe) dans ton exposé :
Le déroulement et la sélection sont deux choses totalement distinctes.
La sélection ne peut qu'être totalement indépendante du déroulement. Le déroulement ne sélectionne rien.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0

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

Posez votre question
Utilisateur anonyme
26 oct. 2012 à 22:12
Bonsoir

Tu devrai utiliser la déclaration de SendMessge générale
A savoir :
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long


Et utiliser StrPtr au lieu de VarPtr (d'ailleurs ton code est erroné
avec lParam en string et varptr qui te retourne un long)


Je met mon code de test (mais avec la combo dans la from) en exemple
Une combo et un bouton dans une from vierge

Private Const CB_ERR = (-1)
Private Const CB_SELECTSTRING = &H14D
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Private Sub Command1_Click()
  Dim ret As Long
  ret = SendMessage(Combo1.hwnd, CB_SELECTSTRING, -1, StrPtr("Patates"))
  Me.Caption = ret  
End Sub

Private Sub Form_Load()
  Combo1.AddItem "Radis"
  Combo1.AddItem "Carottes"
  Combo1.AddItem "Patates"
  Combo1.AddItem "Ambulances"
End Sub



_____________
Kenji
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 oct. 2012 à 22:37
Bonjour, Charles Racaud
Me permets-tu de te faire observer que ton exemple est celui de SendMessage appliquée à une combobox de VB6 ?
J'ai dit ce que j'en pensais vendredi 19 octobre 2012 à 11:07:18
Sache que ton code ne fonctionnerait même pas avec une combobox de Office, pourtant elle aussi de Microsoft, mais pas la même
Quand bien même (on sait le faire) tu aurais extrait son hwnd.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Utilisateur anonyme
27 oct. 2012 à 00:11
Pour moi (enfin sur ma version d'office 2010), les control des userfroms n'ont pas d'handle donc il est sûr que ce n'est pas possible pour ce cas. Il en sera de même pour les application utilisant WPF, Flash ou les autres technologies similaires.

Je suppose que JLASOPRA à correctement identifier l'handle appartenant bien à une class combobox Windows standard ou une class dérivé (combo de vb6 par exemple).

A lui d'effectuer ces testes.

_____________
Kenji
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
27 oct. 2012 à 08:45
Le problème n'est pas celui du handle et on sait par exemple parfaitement extraire sans trop de difficultés tant celui d'un UserForm que celui d'une combobox qui s'y trouverait.
Le problème est par contre très sérieusement celui du type de combobox à traiter et là : je ne vois rien qui puisse permettre :
1) de l'identifier
2) si pas exactement du même type que celui de VB6 : de gérer sans faille par SendMessage.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Rejoignez-nous