// Executa a captura de dado solicitada pela biblioteca
        private int ShowCorrespondingWindow(PW_GetData[] expectedData, ref FormDisplayQRcode fdqr)
        {
            int                ret   = 0;
            ushort             index = 0;
            FormDisplayMessage fdm;

            foreach (PW_GetData item in expectedData)
            {
                // Caso exista uma mensagem a ser exibida ao usuário antes da captura do dado
                if (item.szMsgPrevia.Length > 0)
                {
                    fdm = new FormDisplayMessage();
                    fdm.ShowDialog(item.szMsgPrevia, 3000);
                    fdm.Dispose();
                }

                ret = 0;
                switch (item.bTipoDeDado)
                {
                case 0:
                    Debug.Print(string.Format("ERRO!!! Item com valor zerado."));
                    return(ret);

                // Caso a automação trabalhe com captura de código de barras, necessário
                // implementar os casos que serão aceitos (digitado, leitor...), bem como
                //  as validações necessárias por tipo de código
                case (int)E_PWDAT.PWDAT_BARCODE:
                    ret = GetTypedDataFromUser(item);
                    return(ret);

                // Menu de opções
                case (int)E_PWDAT.PWDAT_MENU:
                    return(GetMenuFromUser(item));

                // Captura de dado digitado
                case (int)E_PWDAT.PWDAT_TYPED:
                    ret = GetTypedDataFromUser(item);
                    return(ret);

                // Autenticação de permissão de usuário
                case (int)E_PWDAT.PWDAT_USERAUTH:
                    ret = GetTypedDataFromUser(item);
                    return(ret);

                // Captura de dados do cartão
                case (int)E_PWDAT.PWDAT_CARDINF:
                    // Caso só seja aceito o modo de entrada de cartão digitado
                    if (item.ulTipoEntradaCartao == 1)
                    {
                        PW_GetData temp = item;
                        temp.wIdentificador = (ushort)E_PWINFO.PWINFO_CARDFULLPAN;
                        ret = GetTypedDataFromUser(temp);
                    }
                    // Caso seja aceito cartão lido pelo PIN-pad
                    else
                    {
                        ret = Interop.PW_iPPGetCard(index);
                        Debug.Print(string.Format("PW_iPPGetCard={0}", ret.ToString()));
                        if (ret == (int)E_PWRET.PWRET_OK)
                        {
                            ret = LoopPP();
                        }
                    }
                    return(ret);

                // Processamento offline do cartão
                case (int)E_PWDAT.PWDAT_CARDOFF:
                    ret = Interop.PW_iPPGoOnChip(index);
                    Debug.Print(string.Format("PW_iPPGoOnChip={0}", ret.ToString()));
                    if (ret == (int)E_PWRET.PWRET_OK)
                    {
                        ret = LoopPP();
                    }
                    return(ret);

                // Processamento online do cartão
                case (int)E_PWDAT.PWDAT_CARDONL:
                    ret = Interop.PW_iPPFinishChip(index);
                    Debug.Print(string.Format("PW_iPPFinishChip={0}", ret.ToString()));
                    if (ret == (int)E_PWRET.PWRET_OK)
                    {
                        ret = LoopPP();
                    }
                    return(ret);

                // Confirmação de dado no PIN-pad
                case (int)E_PWDAT.PWDAT_PPCONF:
                    ret = Interop.PW_iPPConfirmData(index);
                    Debug.Print(string.Format("PW_iPPConfirmData={0}", ret.ToString()));
                    if (ret == (int)E_PWRET.PWRET_OK)
                    {
                        ret = LoopPP();
                    }
                    return(ret);

                // Confirmação positiva PIN-pad
                case (int)E_PWDAT.PWDAT_PPDATAPOSCNF:
                    ret = Interop.PW_iPPPositiveConfirmation(index);
                    Debug.Print(string.Format("PW_iPPPositiveConfirmation={0}", ret.ToString()));
                    if (ret == (int)E_PWRET.PWRET_OK)
                    {
                        ret = LoopPP();
                    }
                    return(ret);

                // Comando genérico no PIN-pad
                case (int)E_PWDAT.PWDAT_PPGENCMD:
                    ret = Interop.PW_iPPGenericCMD(index);
                    Debug.Print(string.Format("PW_iPPGenericCMD={0}", ret.ToString()));
                    if (ret == (int)E_PWRET.PWRET_OK)
                    {
                        ret = LoopPP();
                    }
                    return(ret);

                // Senha do portador
                case (int)E_PWDAT.PWDAT_PPENCPIN:
                    ret = Interop.PW_iPPGetPIN(index);
                    Debug.Print(string.Format("PW_iPPGetPIN={0}", ret.ToString()));
                    if (ret == (int)E_PWRET.PWRET_OK)
                    {
                        ret = LoopPP();
                    }
                    return(ret);

                // Entrada digitada no PIN-pad
                case (int)E_PWDAT.PWDAT_PPENTRY:
                    ret = Interop.PW_iPPGetData(index);
                    Debug.Print(string.Format("PW_iPPGetData={0}", ret.ToString()));
                    if (ret == (int)E_PWRET.PWRET_OK)
                    {
                        ret = LoopPP();
                    }
                    return(ret);

                // Remoção de cartão do PIN-pad
                case (int)E_PWDAT.PWDAT_PPREMCRD:
                    ret = Interop.PW_iPPRemoveCard();
                    Debug.Print(string.Format("PW_iPPRemoveCard={0}", ret.ToString()));
                    if (ret == (int)E_PWRET.PWRET_OK)
                    {
                        ret = LoopPP();
                    }
                    return(ret);

                // Exibição de mensagem de interface no display da automação
                case (int)E_PWDAT.PWDAT_DSPCHECKOUT:
                    fdm = new FormDisplayMessage();
                    fdm.Start();
                    fdm.ChangeText(item.szPrompt);
                    Thread.Sleep(1000);
                    // Caso o operador tenha apertado a tecla ESC, cancela a operação e aborta o comando do PINpad
                    if (fdm.isAborted())
                    {
                        // Aborta a operação em curso no PIN-pad
                        Interop.PW_iPPAbort();

                        // Atribui o retorno de aoperação cancelada
                        ret = (int)E_PWRET.PWRET_CANCEL;
                    }
                    fdm.Stop();

                    if (ret != (int)E_PWRET.PWRET_OK)
                    {
                        return(ret);
                    }
                    // Sinaliza a exibição da mensagem para a biblioteca
                    ret = Interop.PW_iAddParam(item.wIdentificador, "");
                    return((int)E_PWRET.PWRET_OK);

                // Exibição de QRcode no display da automação
                case (int)E_PWDAT.PWDAT_DSPQRCODE:

                    // Exemplo 2: A string com o QR Code é recebida e um QRcode é gerado utilizando uma biblioteca
                    // de terceiros, para compilar essa opção é necessário descomentar a função AtualizaQRCode na classe FormDisplayQRcode
                    // e instalar a biblioteca  MessagingToolkit.QRCode em seu Visual studio através do gerenciador de pacotes
                    // com o comando "Install-Package MessagingToolkit.QRCode -ProjectName PGWLib"
                    StringBuilder stringQRcode = new StringBuilder(5001);

                    // Tenta obter o valor do QRcode a ser exibido, caso não ache retorna operação cancelada
                    if (Interop.PW_iGetResult((short)E_PWINFO.PWINFO_AUTHPOSQRCODE, stringQRcode, 5001) != (int)E_PWRET.PWRET_OK)
                    {
                        return((int)E_PWRET.PWRET_CANCEL);
                    }

                    // Exibe o QRcode e o prompt
                    fdqr.Start();

                    // Para esse caso em específico o QR code é muito grande para exibir no display "padrão"
                    // Somente para esse exemplo, liga o autoSize da janela
                    fdqr.ChangeText(item.szPrompt, stringQRcode.ToString());

                    // Caso o operador tenha apertado a tecla ESC, cancela a operação e aborta o comando do PINpad
                    if (fdqr.isAborted())
                    {
                        // Aborta a operação em curso no PIN-pad
                        Interop.PW_iPPAbort();

                        fdqr.Stop();

                        // Atribui o retorno de aoperação cancelada
                        return((int)E_PWRET.PWRET_CANCEL);
                    }

                    // Sinaliza a exibição do QRcode para a biblioteca
                    ret = Interop.PW_iAddParam(item.wIdentificador, "");
                    return((int)E_PWRET.PWRET_OK);

                default:
                    break;
                }
                index++;
            }
            return(ret);
        }
        // Executa a captura de dado solicitada pela biblioteca
        private int ShowCorrespondingWindow(PW_GetData[] expectedData)
        {
            int    ret   = 0;
            ushort index = 0;

            foreach (PW_GetData item in expectedData)
            {
                // Caso exista uma mensagem a ser exibida ao usuário antes da captura do dado
                if (item.szMsgPrevia.Length > 0)
                {
                    FormDisplayMessage fdm = new FormDisplayMessage();
                    fdm.ShowDialog(item.szMsgPrevia, 3000);
                    fdm.Dispose();
                }

                ret = 0;
                switch (item.bTipoDeDado)
                {
                case 0:
                    Debug.Print(string.Format("ERRO!!! Item com valor zerado."));
                    return(ret);

                // Caso a automação trabalhe com captura de código de barras, necessário
                // implementar os casos que serão aceitos (digitado, leitor...), bem como
                //  as validações necessárias por tipo de código
                case (int)E_PWDAT.PWDAT_BARCODE:
                    ret = GetTypedDataFromUser(item);
                    return(ret);

                // Menu de opções
                case (int)E_PWDAT.PWDAT_MENU:
                    return(GetMenuFromUser(item));

                // Captura de dado digitado
                case (int)E_PWDAT.PWDAT_TYPED:
                    ret = GetTypedDataFromUser(item);
                    return(ret);

                // Autenticação de permissão de usuário
                case (int)E_PWDAT.PWDAT_USERAUTH:
                    ret = GetTypedDataFromUser(item);
                    return(ret);

                // Captura de dados do cartão
                case (int)E_PWDAT.PWDAT_CARDINF:
                    // Caso só seja aceito o modo de entrada de cartão digitado
                    if (item.ulTipoEntradaCartao == 1)
                    {
                        PW_GetData temp = item;
                        temp.wIdentificador = (ushort)E_PWINFO.PWINFO_CARDFULLPAN;
                        ret = GetTypedDataFromUser(temp);
                    }
                    // Caso seja aceito cartão lido pelo PIN-pad
                    else
                    {
                        ret = Interop.PW_iPPGetCard(index);
                        Debug.Print(string.Format("PW_iPPGetCard={0}", ret.ToString()));
                        if (ret == (int)E_PWRET.PWRET_OK)
                        {
                            ret = LoopPP();
                        }
                    }
                    return(ret);

                // Processamento offline do cartão
                case (int)E_PWDAT.PWDAT_CARDOFF:
                    ret = Interop.PW_iPPGoOnChip(index);
                    Debug.Print(string.Format("PW_iPPGoOnChip={0}", ret.ToString()));
                    if (ret == (int)E_PWRET.PWRET_OK)
                    {
                        ret = LoopPP();
                    }
                    return(ret);

                // Processamento online do cartão
                case (int)E_PWDAT.PWDAT_CARDONL:
                    ret = Interop.PW_iPPFinishChip(index);
                    Debug.Print(string.Format("PW_iPPFinishChip={0}", ret.ToString()));
                    if (ret == (int)E_PWRET.PWRET_OK)
                    {
                        ret = LoopPP();
                    }
                    return(ret);

                // Confirmação de dado no PIN-pad
                case (int)E_PWDAT.PWDAT_PPCONF:
                    ret = Interop.PW_iPPConfirmData(index);
                    Debug.Print(string.Format("PW_iPPConfirmData={0}", ret.ToString()));
                    if (ret == (int)E_PWRET.PWRET_OK)
                    {
                        ret = LoopPP();
                    }
                    return(ret);

                // Confirmação positiva PIN-pad
                case (int)E_PWDAT.PWDAT_PPDATAPOSCNF:
                    ret = Interop.PW_iPPPositiveConfirmation(index);
                    Debug.Print(string.Format("PW_iPPPositiveConfirmation={0}", ret.ToString()));
                    if (ret == (int)E_PWRET.PWRET_OK)
                    {
                        ret = LoopPP();
                    }
                    return(ret);

                // Comando genérico no PIN-pad
                case (int)E_PWDAT.PWDAT_PPGENCMD:
                    ret = Interop.PW_iPPGenericCMD(index);
                    Debug.Print(string.Format("PW_iPPGenericCMD={0}", ret.ToString()));
                    if (ret == (int)E_PWRET.PWRET_OK)
                    {
                        ret = LoopPP();
                    }
                    return(ret);

                // Senha do portador
                case (int)E_PWDAT.PWDAT_PPENCPIN:
                    ret = Interop.PW_iPPGetPIN(index);
                    Debug.Print(string.Format("PW_iPPGetPIN={0}", ret.ToString()));
                    if (ret == (int)E_PWRET.PWRET_OK)
                    {
                        ret = LoopPP();
                    }
                    return(ret);

                // Entrada digitada no PIN-pad
                case (int)E_PWDAT.PWDAT_PPENTRY:
                    ret = Interop.PW_iPPGetData(index);
                    Debug.Print(string.Format("PW_iPPGetData={0}", ret.ToString()));
                    if (ret == (int)E_PWRET.PWRET_OK)
                    {
                        ret = LoopPP();
                    }
                    return(ret);

                // Remoção de cartão do PIN-pad
                case (int)E_PWDAT.PWDAT_PPREMCRD:
                    ret = Interop.PW_iPPRemoveCard();
                    Debug.Print(string.Format("PW_iPPRemoveCard={0}", ret.ToString()));
                    if (ret == (int)E_PWRET.PWRET_OK)
                    {
                        ret = LoopPP();
                    }
                    return(ret);

                default:
                    break;
                }
                index++;
            }
            return(ret);
        }