【问题标题】:Credential Provider 'SetComboBoxSelectedValue' not called with appended field未使用附加字段调用凭据提供程序“Set ComboBox SelectedValue”
【发布时间】:2019-05-21 08:16:14
【问题描述】:

我正在从 VistaCredentialProviderSamples 运行 SampleWrapExistingCredentialProvider,并且在 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;
}

我还需要检测附加字段的组合框选定项索引。关于如何检测附加组合框项目的索引的任何帮助将不胜感激?

【问题讨论】:

    标签: c++ winapi combobox credential-providers


    【解决方案1】:

    新的组合框项目将始终附加到列表的末尾。

    您有责任跟踪出现的顺序,并且您可以维护列表的内部“副本”以跟踪更改。

    因为您正在使用SampleWrapExistingCredentialProvider,您可以创建一个代理类来跟踪从包装的提供程序内部到登录 UI 的调用。

    更新

    我刚刚检查了我的提供商的日志。

    我在GetSerialization 方法中填充组合框列表。

    在多次调用AppendFieldComboBoxItem 填充列表后,我手动调用SetFieldComboBoxSelectedItem 并将第三个参数设置为0 以确保选择第一项。

    然后我将pcpgsr 设置为CPGSR_NO_CREDENTIAL_NOT_FINISHED 值。

    当控件退出 GetSerialization 方法时,登录 UI 立即使用 SetComboBoxSelectedValue 和值 0 回叫我。

    【讨论】:

    • 假设我维护了列表的内部副本,但是如何检测在运行时选择了哪个项目?选择附加项时会触发哪个功能?因为选择附加项目时不会触发 SetComboBoxSelectedValue。对于其他人,它被解雇了,我能够检测到选定的项目索引
    • 我在列表中默认有两个项目,其他项目我在 API 调用后动态附加,在凭据提供程序初始化时。现在,我的问题是,当用户从组合框中选择一个项目后单击提交按钮时,我无法获取用户选择了哪个项目
    • 在我的情况下,我的凭据提供程序凭据被称为关于组合框选择更改。我会检查日志文件...
    • 谢谢,非常感谢
    • 好的.. 我通过解决方法实现了我的目标:我使用了删除方法而不是追加方法。我在初始化时静态地包括列表中的所有项目,然后在运行时,我动态删除用户不需要的项目。在这种情况下,如果用户需要所有项目,我不会删除任何项目并且能够获取所有项目的索引
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多