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
- Teremos que criar uma flag para exibir a mensagem apenas 1 vez a cada efetuação de login, para isso iremos controlar em uma variável chamada __lMostrou
- 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 usei um texto chumbado apenas para exemplificar)
- 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() //.... u_zMsgPopup() //.... Return /*/{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 := GetArea() Local cPastaTemp := GetTempPath() Local cArquiBat := "test-message.bat" Local cConteuBat := "" Local cTitulo := "" Local cMensagem := "" //Tratativa para que, se a variável não existir, iremos criar ela como public If Type("__lMostrou") == "U" Public __lMostrou := .F. EndIf //Se for o módulo financeiro (variável pública do Protheus) If nModulo == 6 //Se a mensagem não tiver sido exibida ainda If ! __lMostrou //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) EndIf //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 5 Títulos a Pagar vencendo hoje e " cMensagem += "Existem 8 Títulos a Receber vencendo hoje" //Por último, iremos mostrar o comando, executando o bat, e passando as variaveis montadas acima ShellExecute("OPEN", cArquiBat, '"' + cMensagem + '" Information "' + cTitulo + '"', cPastaTemp, 0 ) //Altera a flag para não mostrar novamente a mensagem __lMostrou := .T. EndIf EndIf RestArea(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.