Поставщик учетных данных SetComboBoxSelectedValue не вызывается с добавленным полем - PullRequest
1 голос
/ 21 мая 2019

Я запускаю 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;
}

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

1 Ответ

0 голосов
/ 21 мая 2019

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

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

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

Обновление

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...