Могу ли я создать CommandLink, который работает так же, как кнопка отправки? - PullRequest
0 голосов
/ 28 июня 2018

Пожалуйста, поймите, что у меня нет навыков письма.

Я тестирую, чтобы создать пользовательский поставщик учетных данных. Я хочу создать CommandLink, который делает то же самое с кнопкой отправки. Я хочу войти в систему через CommandLink отдельно от кнопки Отправить. В настоящее время через providerFilter::Filter(CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus, DWORD dwFlags, GUID* rgclsidProviders, BOOL* rgbAllow, DWORD cProviders) предоставляется только пользовательский поставщик учетных данных. enter image description here Нажмите [кнопку Anathor Longon], чтобы войти.

Это мой пример кода:

 HRESULT CSampleCredential::CommandLinkClicked(DWORD dwFieldID)
 {
     HRESULT hr = S_OK;
     DWORD dwResult = 0;

     if (dwFieldID < ARRAYSIZE(_rgCredProvFieldDescriptors) &&
         (CPFT_COMMAND_LINK == _rgCredProvFieldDescriptors[dwFieldID].cpft))
     {
         HWND hwndOwner = nullptr;
         switch (dwFieldID)
         {
         case SFI_ANATHOR_SUBMIT_LINK:
             dwResult = function_foo();
             if(dwResult == 1) { 
                  Call GetSerialization()...?
                  Run the logon.
             }
             break;
             // ...
         }
     }
 }

1 Ответ

0 голосов
/ 19 июля 2018

Поскольку вы пишете провайдер учетных данных, вы уже реализуете интерфейс ICredentialProvider и его метод Advise:

    virtual HRESULT STDMETHODCALLTYPE Advise( 
        /* [annotation][in] */ 
        _In_  ICredentialProviderEvents *pcpe,
        /* [annotation][in] */ 
        _In_  UINT_PTR upAdviseContext) = 0;

Первый аргумент - указатель на интерфейс событий ICredentialProviderEvents, который имеет только один метод: CredentialsChanged. Ваша задача - получить учетные данные от пользователя (логин / пароль), сохранить их внутри своих внутренних устройств и вызвать этот метод. На следующем ходу ваш провайдер будет называться следующим методом:

    virtual HRESULT STDMETHODCALLTYPE GetCredentialCount( 
        /* [annotation][out] */ 
        _Out_  DWORD *pdwCount,
        /* [annotation][out] */ 
        _Out_  DWORD *pdwDefault,
        /* [annotation][out] */ 
        _Out_  BOOL *pbAutoLogonWithDefault) = 0;

Ваша задача - вернуть правильные значения в параметрах pdwDefault и pbAutoLogonWithDefault (я предлагаю 0 и TRUE). Тогда ваш класс, реализующий интерфейс ICredentialProviderCredential, будет немедленно вызван для метода GetSerialization.

Здесь вы можете вернуть уже сохраненные учетные данные.

...