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. 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
  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 usei um texto chumbado apenas para exemplificar)
  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() 
        //....
	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.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

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