Поставщик учетных данных «SetComboBoxSelectedValue» не вызывается с добавленным полем

Я запускаю SampleWrapExistingCredentialProvider из VistaCredentialProviderSamples, и в файле CSampleCredential.cpp есть функция SetComboBoxSelectedValue. Эта функция вызывается, когда пользователь изменяет выбранный элемент в поле со списком и сохраняет индекс выбранного элемента. Однако, когда я добавляю элемент в поле со списком во время выполнения с помощью функции AppendFieldComboBoxItem, а затем, если добавленный элемент выбран, эта функция не вызывается . Из-за этого я не могу получить индекс выбранного элемента для добавленного поля.

Я попытался отобразить окно сообщений, чтобы увидеть, когда вызывается эта функция. Эта функция вызывается только в том случае, если один из элементов списка по умолчанию выбран пользователем, и не вызывается при выборе добавленных элементов.

// Called when the user changes the selected item in the combobox. We'll check to see if 
// it's for us or the wrapped credential, and then handle or route it as appropriate.
HRESULT CSampleCredential::SetComboBoxSelectedValue(
DWORD dwFieldID,
DWORD dwSelectedItem
)
{
    HRESULT hr = E_UNEXPECTED;

// Make sure we have a wrapped credential.
if (_pWrappedCredential != NULL)
{
    // If this field belongs to the wrapped credential, hand it off.
    if (_IsFieldInWrappedCredential(dwFieldID))
    {
        hr = _pWrappedCredential->SetComboBoxSelectedValue(dwFieldID, dwSelectedItem);
    }
    // Otherwise determine if we need to handle it.
    else
    {
        FIELD_STATE_PAIR *pfsp = _LookupLocalFieldStatePair(dwFieldID);
        if ((pfsp != NULL) && (dwSelectedItem < ARRAYSIZE(s_rgDatabases)))
        {
            _dwComboIndex = dwSelectedItem;

            HWND hwndOwner = nullptr;
            if (_pCredProvCredentialEvents)
            {
                _pCredProvCredentialEvents->OnCreatingWindow(&hwndOwner);
            }
            TCHAR msg[100];
            StringCbPrintf(msg, 100, TEXT("%d"), _dwComboIndex);
            MessageBox(hwndOwner, msg, TEXT("Combobox selected ID"), MB_OK | MB_ICONERROR);

            hr = S_OK;
        }
        else
        {
            hr = E_INVALIDARG;
        }
    }
}

return hr;
}

Мне также нужно определить индекс выбранного элемента со списком для добавленных полей. Будем признательны за любую помощь в том, как определить индекс добавленного элемента со списком?


person js.hrt    schedule 21.05.2019    source источник


Ответы (1)


Новые элементы Combobox всегда будут добавляться в конец списка.

Вы несете ответственность за отслеживание порядка появления, и вы можете вести внутреннюю «копию» списка для отслеживания изменений.

Поскольку вы работаете с SampleWrapExistingCredentialProvider, вы можете создать прокси-класс, который будет отслеживать вызовы внутри обернутого провайдера для входа в пользовательский интерфейс.

Обновить

Я только что проверил журнал своего провайдера.

Я заполняю список выпадающего списка внутри метода GetSerialization.

После заполнения списка несколькими вызовами AppendFieldComboBoxItem я вручную вызываю SetFieldComboBoxSelectedItem с третьим параметром, установленным на 0, чтобы убедиться, что выбран первый элемент.

Затем я установил pcpgsr в значение CPGSR_NO_CREDENTIAL_NOT_FINISHED.

Когда управление выходит из метода GetSerialization, интерфейс входа в систему немедленно перезванивает мне с SetComboBoxSelectedValue и значением 0.

person Alexander    schedule 21.05.2019
comment
Допустим, я поддерживаю внутреннюю копию списка, но как определить, какой элемент выбран во время выполнения? Какая функция будет запущена при выборе добавленного элемента? потому что SetComboBoxSelectedValue не запускается при выборе добавленного элемента. Для других он срабатывает, и я могу определить индекс выбранного элемента. - person js.hrt; 21.05.2019
comment
У меня есть два элемента по умолчанию в списке, другие я добавляю динамически после вызовов API во время инициализации поставщика учетных данных. Теперь моя проблема в том, что когда пользователь нажимает кнопку отправки после выбора элемента из поля со списком, я не могу получить, какой элемент выбран пользователем - person js.hrt; 21.05.2019
comment
В моем случае мои учетные данные поставщика учетных данных вызываются об изменении выбора поля со списком. Я проверю лог-файлы... - person Alexander; 21.05.2019
comment
Спасибо, буду очень признателен - person js.hrt; 21.05.2019
comment
Исправил мой ответ с объяснением. - person Alexander; 22.05.2019
comment
Спасибо, я делаю точно так же. - person js.hrt; 22.05.2019
comment
Но, как вы сказали: «Когда элемент управления выходит из метода GetSerialization, пользовательский интерфейс входа в систему немедленно перезванивает мне с помощью SetComboBoxSelectedValue и значения 0». Таким образом, я также могу получить индекс, и выбранный элемент будет обновлен. Но на этом экране, если пользователь изменяет выбранный элемент и выбирает элемент, который был динамически добавлен, этот обратный вызов не запускается. Однако этот обратный вызов запускается, если мы выбираем элементы по умолчанию, которые были статически включены в список, поэтому я не могу определить индекс при выборе пользователем. Я надеюсь, вы поняли мою мысль? - person js.hrt; 22.05.2019
comment
В моем сценарии все мои элементы в списке добавляются динамически. Изначально список комбо моего CP пуст, и вся комбо скрыта. - person Alexander; 24.05.2019
comment
Хорошо. Я достиг своей цели, выполнив обходной путь: я использовал подход удаления вместо подхода добавления. Я включаю все элементы в список статически во время инициализации, затем во время выполнения я динамически удаляю элементы, которые мне не нужны для пользователя. В этом случае, если пользователю требуются все элементы, я не удаляю ни один элемент и могу получить индекс всех элементов. - person js.hrt; 25.05.2019