Exibindo uma notificação no Windows através de um programa em AdvPL

Hoje vou mostrar como fazer a integração com Windows 10 para exibição de mensagens personalizadas ao usuário (barra de notificação).

Um dos recursos nativos do Windows, são aquelas mensagens que são exibidas na barra de notificação, por exemplo, ao plugar um dispositivo USB, ao receber um e-Mail, etc.

Pensando nisso, decidi criar uma integração com AdvPL, para exibir uma mensagem quando o usuário realizar o login no sistema.

Para isso, temos que criar um bat que usa integração com PowerShell, e foi tomado como exemplo, o seguinte link – https://stackoverflow.com/questions/50927132/show-balloon-notifications-from-batch-file.

Com isso, para executarmos o comando, basta executarmos o .bat, passando a mensagem e o título, então por exemplo: test-message.bat “Bem vindo Daniel Atilio” Information “[Protheus] Atenção”

Exemplo de mensagem de teste

Agora que já vimos que é possível exibir a mensagem, iremos criar o fonte em AdvPL, sendo que a lógica será assim:

  1. Criar um ponto de entrada, após realizar o login – será usado o AfterLogin
  2. Iremos criar uma função que será chamada nesse p.e., nessa função iremos testar se o módulo é o Financeiro
  3. Para que não fique sempre exibindo a mensagem, no nome do nosso bat, iremos colocar a data
  4. Será criado um arquivo test-message.bat na pasta temporária do Windows
  5. Será montado a mensagem e o título que será exibido ao usuário (aqui pode se usar query SQL para montar o texto, nesse exemplo a função Contar para buscar a quantidade de títulos em aberto na base)
  6. Por último, via ShellExecute iremos executar o .bat passando os parâmetros de mensagem e título para ser exibido

Abaixo uma mensagem exibida pelo programa em AdvPL, exibindo apenas um aviso sobre títulos financeiros vencendo:

Exemplo de mensagem gerada pelo programa

Dessa forma, esse fonte pode ser adaptado para outros módulos, exibindo mensagens diversas como para usuários do Compras (algo como prazo de entrega), PCP (algo relacionado as OPs), Faturamento (exibindo informações de metas de vendas), etc.

Abaixo o código fonte desenvolvido:

//Bibliotecas
#Include "TOTVS.ch"

User Function AfterLogin()
    Local aArea := FWGetArea()

    //Se estiver usando o módulo financeiro
    If nModulo == 6
        u_zMsgPopup()
    EndIf

    FWRestArea(aArea)
Return
 
//Disponível em https://terminaldeinformacao.com/2021/09/08/exibindo-uma-notificacao-no-windows-atraves-de-um-programa-em-advpl/

/*/{Protheus.doc} User Function zMsgPopup
Função que mostra um popup de aviso no Windows 10 (Windows Notification Balloon)
@type  Function
@author Atilio
@since 08/04/2021
@version version
@obs A função também pode ser adaptada para ser usada com TSystemTray - https://tdn.totvs.com/display/tec/TSystemTray
@see https://stackoverflow.com/questions/50927132/show-balloon-notifications-from-batch-file
/*/
 
User Function zMsgPopup()
    Local aArea := FWGetArea()
    Local cPastaTemp := GetTempPath()
    Local cArquiBat := dToS(Date()) + "-test-message.bat"
    Local cConteuBat := ""
    Local cTitulo := ""
    Local cMensagem := ""
    Local nTotSE1 := 0
    Local nTotSE2 := 0

    //Primeiro passo, iremos criar um arquivo .bat dentro da pasta temporária do Windows - Conforme exemplo do StackOverFlow Acima
    If ! File(cPastaTemp + cArquiBat)
        cConteuBat := '@echo off' + CRLF
        cConteuBat += '' + CRLF
        cConteuBat += 'if "%~1"=="" call :printhelp  & exit /b 1' + CRLF
        cConteuBat += 'setlocal' + CRLF
        cConteuBat += '' + CRLF
        cConteuBat += 'if "%~2"=="" (set Icon=Information) else (set Icon=%2)' + CRLF
        cConteuBat += 'powershell -Command "[void] [System.Reflection.Assembly]::LoadWithPartialName(' + "'System.Windows.Forms'" + '); $objNotifyIcon=New-Object System.Windows.Forms.NotifyIcon; $objNotifyIcon.BalloonTipText=' + "'%~1'" + '; $objNotifyIcon.Icon=[system.drawing.systemicons]::%Icon%; $objNotifyIcon.BalloonTipTitle=' + "'%~3'" + '; $objNotifyIcon.BalloonTipIcon=' + "'None'" + '; $objNotifyIcon.Visible=$True; $objNotifyIcon.ShowBalloonTip(5000);"' + CRLF
        cConteuBat += '' + CRLF
        cConteuBat += 'endlocal' + CRLF
        cConteuBat += 'goto :eof' + CRLF
        cConteuBat += '' + CRLF
        cConteuBat += ':printhelp' + CRLF
        cConteuBat += 'echo USAGE: %~n0 Text [Icon [Title]]' + CRLF
        cConteuBat += 'echo Icon can be: Application, Asterisk, Error, Exclamation, Hand, Information, Question, Shield, Warning or WinLogo' + CRLF
        cConteuBat += 'exit /b' + CRLF

        MemoWrite(cPastaTemp + cArquiBat, cConteuBat)

        //Busca o total de títulos
        nTotSE1 := Contar("SE1", "SE1->E1_SALDO != 0 .And. Empty(SE1->E1_BAIXA)")
        nTotSE2 := Contar("SE2", "SE2->E2_SALDO != 0 .And. Empty(SE2->E2_BAIXA)")

        //Agora iremos montar a mensagem do comando, aqui estou chumbando ela, mas você pode fazer uma query SQL para montar
        cTitulo := "[Protheus] Atenção"
        cMensagem := "Seja bem vindo -" + Alltrim(UsrRetName(RetCodUsr())) + "- , lembre-se que: "
        cMensagem += "Existem " + cValToChar(nTotSE2) + " Títulos a Pagar em aberto e "
        cMensagem += "Existem " + cValToChar(nTotSE1) + " Títulos a Receber em aberto"

        //Por último, iremos mostrar o comando, executando o bat, e passando as variaveis montadas acima
        ShellExecute("OPEN", cArquiBat, '"' + cMensagem + '" Information "' + cTitulo + '"', cPastaTemp, 0 )
    EndIf

    FWRestArea(aArea)
Return

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

2 Responses

  1. Eduardo De Souza disse:

    Muito bom!! Cara, você posta uns truques que eu nem imagino que daria pra fazer no Siga. Conteúdo excelente!

Deixe uma resposta

Terminal de Informação