Bonjour,
Je travaille actuellement sur un credential provider qui doit afficher deux combobox (SFI_COMBO_1 et SFI_COMBO_2) en plus des autres éléments lorsqu'on clique sur le credential affiché.
Pour cela, j'utilise comme base le sample SampleHardwareEventCredentialProvider des derniers samples de credential provider fournis par Microsoft (archive RTMCredentialProviderSamples__FINAL).
1) Lorsque LogonUI appelle la fonction CSampleCredential::GetComboBoxValueCount pour la première combobox, nous retournons le nombre d'éléments du tableau s_rgComboBoxStrings.
static const PWSTR s_rgComboBoxStrings[] =
{
L"A",
L"B",
};
2) Lorsque LogonUI appelle la fonction CSampleCredential::GetComboBoxValueCount pour la seconde combobox, nous retournons 0 car cette combobox sera mise à vide et remplie à chaque fois que l'on sélectionne A ou B dans la première combobox.
static const PWSTR s_rgComboBoxStrings_A[] =
{
L"A_1",
};
static const PWSTR s_rgComboBoxStrings_B[] =
{
L"B_1",
L"B_2",
L"B_3",
};
Ces deux tableaux ayant un nombre d'éléments différents, nous gardons dans une variable du credential nommée combo_2_count le nombre d'éléments ajoutés à la combobox la fois d'avant.
Ainsi, à chaque fois que l'on sélectionne A ou B, on commence par supprimer tous les éléments précédemment ajoutés :
if (_pCredProvCredentialEvents) {
for (i = combo_2_count - 1; i >= 0; i--) {
hr = _pCredProvCredentialEvents->DeleteFieldComboBoxItem(this, SFI_COMBO_2, i);
}
}
Ensuite, si on sélectionne A dans la 1ère combobox, on ajoute les éléments du tableau s_rgComboBoxStrings_A à la 2nde combobox ; si on choisit B, les éléments du tableau s_rgComboBoxStrings_B sont ajoutés :
combo_2_count = ARRAYSIZE(s_rgComboBoxStrings_A);
if (_pCredProvCredentialEvents) {
for (i = 0; i < combo_2_count; i++) {
hr = _pCredProvCredentialEvents->AppendFieldComboBoxItem(this, SFI_COMBO_2, s_rgComboBoxStrings_A[i]);
}
}
Une fois, ces éléments ajoutés, nous appelons la fonction SetFieldComboBoxSelectedItem de la manière suivante :
hr = _pCredProvCredentialEvents->SetFieldComboBoxSelectedItem(this, SFI_COMBO_2, 0);
afin de sélectionner le 1er élément de la 2nde combobox.
Mais, visiblement aléatoirement, le 1er élément n'est pas toujours sélectionné. Ceci oblige l'utilisateur à dérouler la liste.
Pourtant, la fonction SetFieldComboBoxSelectedItem retourne toujours S_OK.
D'autre part, si on ne veut rien afficher lorsqu'on sélectionne A et B a été sélectionné auparavant :
- Lorsqu'on choisit A, on appelle DeleteFieldComboBoxItem pour supprimer les 3 éléments de B précédemment ajoutés ;
- AppendFieldComboBoxItem n'est pas appelée puisque pour A on ne veut afficher aucun élément.
Dans ce cas, la 2nde combobox contient trois éléments vides qui ne peuvent être sélectionnés alors qu'elle ne devrait pas avoir d'éléments car nous n'avons rien ajouté.
Sauriez-vous d'où peut venir ce problème ?
Cette façon de faire pour remplir et vider une combobox dans un credential est-elle correcte ?
Y a-t-il une autre façon de faire ?
Vous trouverez le code source complet du credential provider ci-joint si besoin.
Merci d'avance pour votre aide.
Partager