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”
Agora que já vimos que é possível exibir a mensagem, iremos criar o fonte em AdvPL, sendo que a lógica será assim:
- Criar um ponto de entrada, após realizar o login – será usado o AfterLogin
- Iremos criar uma função que será chamada nesse p.e., nessa função iremos testar se o módulo é o Financeiro
- Para que não fique sempre exibindo a mensagem, no nome do nosso bat, iremos colocar a data
- Será criado um arquivo test-message.bat na pasta temporária do Windows
- 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)
- 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:
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.
Muito bom!! Cara, você posta uns truques que eu nem imagino que daria pra fazer no Siga. Conteúdo excelente!
Opa, obrigado pelo feedback e carinho jovem.
Grande abraço.