alex2002 Posted July 20, 2022 Report Share Posted July 20, 2022 Olá PessoALL, Alguém saberia me dizer se consigo fazer uma associação de uma função xHarbour para ser utilizada na notificação do Windows (aquela mesma do tray já comentado aqui no grupo)? Pergunto pois, se o sistema notificar o usuário dentro do sistema, queria abrir uma janela caso o usuário clique na notificação. Exatamente igual existe para atualizações do Java, etc. Não sei se é possível, mas se for será de granda valia pra mim. Um abraço, Alexandre Pereira Quote Link to comment Share on other sites More sharing options...
alex2002 Posted July 20, 2022 Author Report Share Posted July 20, 2022 Ninguém ou eu não soube explicar? rsrsrsrsrs Quote Link to comment Share on other sites More sharing options...
Jmsilva Posted July 20, 2022 Report Share Posted July 20, 2022 Olá, existe a classe da Fivewin TTrayIcon que faz exatamente isto! na pasta samples tem exemplo: testtray.prg #include "Fivewin.CH" static oWnd, oTray, oIcon function TESTIT() local oIcon1 DEFINE ICON oIcon FILE "..\icons\fivewin.ICO" DEFINE ICON oIcon1 FILE "..\icons\folder.ico" DEFINE WINDOW oWnd TITLE "Icon Tray Class for FiveWin! from Jim Gale" ICON oIcon ACTIVATE WINDOW oWnd ; ON INIT oTray := TTrayIcon():New( oWnd, oIcon, "Testing tray ...",; { || MsgInfo( "Left CLick" ) },; { | nRow, nCol | MenuTray( nRow, nCol, oTray ) } ) ; VALID oTray:End() ; ON RIGHT CLICK oTray:SetIcon( oIcon1, "Another" ) return NIL function MenuTray( nRow, nCol, oTray ) local oMenu MENU oMenu POPUP MENUITEM "Show" ACTION oWnd:Show(), oWnd:SetFocus() MENUITEM "Hide" ACTION oWnd:Hide() SEPARATOR MENUITEM "Close Application" ACTION oWnd:end() ENDMENU ACTIVATE POPUP oMenu AT nRow, nCol OF oTray:oWnd return NIL Por algum motivo não consegui fazer funcionar perfeitamente no xHarbour, acabei usando HB32 deu tudo certo. Mas não verifiquei a causa do erro no xHB. JMSilva Quote Link to comment Share on other sites More sharing options...
alex2002 Posted July 21, 2022 Author Report Share Posted July 21, 2022 14 horas atrás, Jmsilva disse: Olá, existe a classe da Fivewin TTrayIcon que faz exatamente isto! na pasta samples tem exemplo: testtray.prg #include "Fivewin.CH" static oWnd, oTray, oIcon function TESTIT() local oIcon1 DEFINE ICON oIcon FILE "..\icons\fivewin.ICO" DEFINE ICON oIcon1 FILE "..\icons\folder.ico" DEFINE WINDOW oWnd TITLE "Icon Tray Class for FiveWin! from Jim Gale" ICON oIcon ACTIVATE WINDOW oWnd ; ON INIT oTray := TTrayIcon():New( oWnd, oIcon, "Testing tray ...",; { || MsgInfo( "Left CLick" ) },; { | nRow, nCol | MenuTray( nRow, nCol, oTray ) } ) ; VALID oTray:End() ; ON RIGHT CLICK oTray:SetIcon( oIcon1, "Another" ) return NIL function MenuTray( nRow, nCol, oTray ) local oMenu MENU oMenu POPUP MENUITEM "Show" ACTION oWnd:Show(), oWnd:SetFocus() MENUITEM "Hide" ACTION oWnd:Hide() SEPARATOR MENUITEM "Close Application" ACTION oWnd:end() ENDMENU ACTIVATE POPUP oMenu AT nRow, nCol OF oTray:oWnd return NIL Por algum motivo não consegui fazer funcionar perfeitamente no xHarbour, acabei usando HB32 deu tudo certo. Mas não verifiquei a causa do erro no xHB. JMSilva Olá meu amigo. Na verdade o que a classe faz é um menu, eu queria que na notificação me desse a oportunidade de executar uma função, quando clicado. Exatamente os antivírus, atualizações nos permitem fazer. Enfim, vou notificar o usuário com shellnotify e se o cara clicar executaria uma determinada função. Creio não ser possível porque a o shellnotify na verdade é uma function das DLLs do windows, por isso acho não ser possível. Mas de qualquer forma, se existir estamos dentro. Um abraço, Alexandre Pereira Quote Link to comment Share on other sites More sharing options...
macs Posted July 21, 2022 Report Share Posted July 21, 2022 ******************************************************************************** ** Arquivo...: TCheckVersaoDisponivel.Prg * ******************************************************************************** ** Função....: TCheckVersaoDisponivel() * ** Objetivo..: Checar se existe uma versão disponível no site do sistema * ** Módulo....: Library * ** Autor.....: Márcio Augusto Cezar * ** Data......: 16/10/2008 17:16:03 * ******************************************************************************** ** Retorno...: * ******************************************************************************** ** Observação: Exemplo da chamada * ** TCheckVersaoDisponivel():new( oWnd, -> Window principal * ** BUILD, -> Versão atual do sistema * ** DT_VERSAO, -> Data da versão atual * ** cSiglaSys, -> Sigla do sistema * ** nome_empresa ) ->Senha da empresa * ** :Execute() -> Método que executa a classe * ** * ******************************************************************************** /* ** Definicoes para o tratamento de efeitos nas dialogs do sistema ** ** Informacoes de animação para API do windows **/ # Define AW_HOR_POSITIVE 1 && Animates the window from left to right. This flag can be used with roll or slide animation. # Define AW_HOR_NEGATIVE 2 && Animates the window from right to left. This flag can be used with roll or slide animation. # Define AW_VER_POSITIVE 4 && Animates the window from top to bottom. This flag can be used with roll or slide animation. # Define AW_VER_NEGATIVE 8 && Animates the window from bottom to top. This flag can be used with roll or slide animation. # Define AW_CENTER 16 && Makes the window appear to collapse inward if AW_HIDE is used or expand outward if the AW_HIDE is not used. # Define AW_HIDE 65536 && Hides the window. By default, the window is shown. # Define AW_ACTIVATE 131072 && Activates the window. # Define AW_SLIDE 262144 && Uses slide animation. By default, roll animation is used. # Define AW_BLEND 524288 && Uses a fade effect. This flag can be used only if hwnd is a top-level window. # Include "FiveWin.Ch" # Include "HBXml.Ch" # Include "FileIO.Ch" # Include "URLLink.Ch" CLASS TCheckVersaoDisponivel PRIVATE: DATA aOcorrencias AS ARRAY DATA cVersaoAtual ,; cVersaoDisponivel ,; cSiglaSistema ,; cSenhaEmpresa ,; cNomeEmpresa ,; cTituloDialog AS CHARACTER DATA cLink ,; cFileVersion ,; cResources AS CHARACTER DATA dDataVersaoAtual ,; dDataVersaoDisponivel AS DATE DATA lSistemaAtivo ,; lForceVisualizacao AS LOGIC DATA oWnd AS OBJECT METHOD getLink() INLINE ::cLink := "http://www.????????????????senha=" + alltrim( ::cSenhaEmpresa ) METHOD putVersaoFile() METHOD dialogMensagem() PUBLIC: METHOD new( oWnd, cVersaoAtual, dDataVersaoAtual, cSiglaSistema, cEmpresa, cTituloDialog ) CONSTRUCTOR METHOD end() INLINE ( PostMessage( self, WM_CLOSE ) ) //setResources( ::cResources ) METHOD execute( lViewDadosLink ) METHOD getSistemaAtivo() INLINE ( ::lSistemaAtivo ) METHOD getVersaoDisponivel() INLINE ( ::cVersaoDisponivel ) METHOD getDataVersao() INLINE ( ::dDataVersaoDisponivel ) METHOD getOcorrencias() INLINE ( ::aOcorrencias ) METHOD ajustaDialog( oDlg ) ENDCLASS ********************************************************************************* ** Método....: new() * ** Objetivo..: Método construtor da classe * ** Autor.....: Márcio Augusto Cezar * ** Data......: 16/10/2008 17:23:19 * ********************************************************************************* ** Observação: * ********************************************************************************* METHOD new( oWnd, cVersaoAtual, dDataVersaoAtual, cSiglaSistema, cEmpresa, cTituloDialog, lForceVisualizacao ) CLASS TCheckVersaoDisponivel DEFAULT cTituloDialog := "Existe uma nova versão disponível para o sistema" DEFAULT lForceVisualizacao := .F. ::oWnd := oWnd ::cResources := getResources() ::cVersaoAtual := alltrim( cVersaoAtual ) ::cSiglaSistema := cSiglaSistema ::cSenhaEmpresa := PassWord( alltrim( cEmpresa ) ) ::dDataVersaoAtual := dDataVersaoAtual ::cTituloDialog := cTituloDialog + " " + cSiglaSistema ::cVersaoDisponivel := "" ::dDataVersaoDisponivel := ctod("") ::lForceVisualizacao := lForceVisualizacao ::cFileVersion := "SystemVer.Txt" RETURN self ********************************************************************************* ** Método....: putVersaoFile() * ** Objetivo..: Escreve a versão do sistema no arquivo XML * ** Autor.....: Márcio Augusto Cezar * ** Data......: 16/10/2008 17:43:11 * ********************************************************************************* ** Observação: * ********************************************************************************* METHOD putVersaoFile() LOCAL oHttp, oUrl IF file( ::cFileVersion ) FErase( ::cFileVersion ) ENDIF oUrl := TUrl():New( ::getLink() ) oHttp := TIPClient():New( oUrl ) oHttp:nConnTimeout := 1000 oHttp:nDefaultPort := 9600 // Gravando no arquivo! /////////////////////// IF oHttp:Open() IF ! oHttp:ReadToFile( ::cFileVersion, FC_NORMAL, 300 ) // msgStop( "Não foi possível criar o arquivo " + ::cFileVersion ) ENDIF ENDIF IF oHttp <> Nil oHttp:Close() ENDIF RETURN file( ::cFileVersion ) ********************************************************************************* ** Método....: Execute() * ** Objetivo..: Executar os procedimentos da classe * ** Autor.....: Márcio Augusto Cezar * ** Data......: 16/10/2008 17:27:39 * ********************************************************************************* ** Observação: * ********************************************************************************* METHOD execute( lViewDadosLink ) CLASS TCheckVersaoDisponivel LOCAL oFile, oXML, oNode, oIter LOCAL aLines := {} DEFAULT lViewDadosLink := .F. ::aOcorrencias := {} BEGIN SEQUENCE // Checando se existe conectividade com a internet ////////////////////////////////////////////////// IF ! ChecaInternet( "www.simtechsistemas.com.br" ) aAdd( ::aOcorrencias, "Não há conexão com a Internet" ) ENDIF IF ! ::putVersaoFile() aAdd( ::aOcorrencias, "Não foi possível gravar o registro de versão no arquivo XML" ) ENDIF TRY oFile := TTxtFile():new( ::cFileVersion ) CATCH aAdd( ::aOcorrencias, "Erro na abertura do arquivo XML" ) END IF FError() <> 0 ::aAdd( ::aOcorrencias, "Erro na abertura do arquivo XML" ) ENDIF IF len( ::aOcorrencias ) <> 0 BREAK ENDIF WHILE ! oFile:lEof() aAdd( aLines, oFile:readLine() ) oFile:Skip() ENDDO oFile:close() IF lViewDadosLink mytoString( aLines ) ENDIF IF len( aLines ) > 0 IF ! ( ::lSistemaAtivo := "ATIVO" $ upper( aLines[01] ) ) BREAK ENDIF ::cNomeEmpresa := aLines[02] FOR nX := 3 TO len( aLines ) IF left( aLines[ nX ], 3 ) == ::cSiglaSistema ::cVersaoDisponivel := subStr( aLines[ nX ], at( "-", aLines[ nX ] ) + 1 ) ::cVersaoDisponivel := alltrim( subStr( ::cVersaoDisponivel, 1, at( "-", ::cVersaoDisponivel ) - 1 ) ) ::dDataVersaoDisponivel := ctod( alltrim( subStr( aLines[ nX ], rat( "-", aLines[ nX ] ) + 1 ) ) ) ENDIF NEXT ENDIF IF ( ::cVersaoDisponivel > ::cVersaoAtual .OR. ::dDataVersaoDisponivel > ::dDataVersaoAtual ) .OR. ::lForceVisualizacao // Exibindo a mensagem na tela ////////////////////////////// ::dialogMensagem() ENDIF END SEQUENCE RETURN ( len( ::aOcorrencias ) == 0 ) ********************************************************************************* ** Método....: ajustaDialog() * ** Objetivo..: Ajustar posicionamento de uma determinada dialog em relação à * ** janela principal * ** Autor.....: Márcio Augusto Cezar * ** Data......: 20/10/2008 - 16:25:22 * ********************************************************************************* ** Parâmetros: oDlg --> Objeto dialog que será ajustado * ********************************************************************************* METHOD ajustaDialog( oDlg ) CLASS TCheckVersaoDisponivel LOCAL aCoorsWnd := { 0, 0 } LOCAL nTopWnd := 0 LOCAL nLeftWnd := 0 // ---> Recuperando as coordenadas da dialog e da janela pai //////////////////////////////////////////////////////////// aCoorsWnd := clientToScreen( ::oWnd:hWnd, aCoorsWnd ) nTopWnd := ( ( aCoorsWnd[1] + ::oWnd:nHeight ) - oDlg:nHeight ) - 77 nLeftWnd := ( ::oWnd:nWidth() - oDlg:nWidth() ) - 8 // ---> Posicionando a dialog ///////////////////////////// oDlg:move( nTopWnd, nLeftWnd,,, .T. ) ::oWnd:setFocus() RETURN ********************************************************************************* ** Método....: dialogMensagem() * ** Objetivo..: Configuração da dialog da mensagem * ** Autor.....: Márcio Augusto Cezar * ** Data......: 20/10/2008 - 16:14:07 * ********************************************************************************* ** Observação: * ********************************************************************************* METHOD dialogMensagem() CLASS TCheckVersaoDisponivel LOCAL oDlg, oFont, oFont2, oLastDlg, oTimer, oLink LOCAL oObj := self LOCAL cColorBack := 16768959 LOCAL cColorText1 := CLR_BLACK LOCAL cColorText2 := CLR_BLUE LOCAL cColorText3 := 106 // ---> Salvando a última janela ativa antes da mensagem //////////////////////////////////////////////////////// oLastDlg := oWndFromhWnd( getActiveWindow() ) setResources( "Comum.Dll" ) DEFINE DIALOG oDlg RESOURCE "CHK_NOVA_VERSAO" OF ::oWnd COLOR CLR_BLACK, cColorBack oFont := TFont():New( "MS Sans Serif", 0, 15,, .T. ) oFont2 := TFont():New( "Courier" , 0, 12,, .T. ) // ---> Criando o timer para close automatico da dialog /////////////////////////////////////////////////////// oTimer := TTimer():new( 10000, { || animateDlg( oDlg, "fadeOut",, .T. ), oTimer:end() }, oObj:oWnd ) REDEFINE SAY ID 4001 OF oDlg COLOR 22784 , cColorBack FONT oFont PROMPT ::cTituloDialog REDEFINE SAY ID 4002 OF oDlg COLOR cColorText1, cColorBack FONT oFont2 PROMPT ::cVersaoAtual REDEFINE SAY ID 4003 OF oDlg COLOR cColorText1, cColorBack FONT oFont2 PROMPT ::dDataVersaoAtual REDEFINE SAY ID 4004 OF oDlg COLOR cColorText2, cColorBack FONT oFont2 PROMPT ::cVersaoDisponivel REDEFINE SAY ID 4005 OF oDlg COLOR cColorText2, cColorBack FONT oFont2 PROMPT ::dDataVersaoDisponivel REDEFINE SAY ID 4006 OF oDlg COLOR cColorText3, cColorBack REDEFINE SAY ID 4007 OF oDlg COLOR cColorText3, cColorBack REDEFINE SAY ID 4008 OF oDlg COLOR cColorText3, cColorBack REDEFINE SAY ID 4009 OF oDlg COLOR cColorText3, cColorBack REDEFINE SAY ID 4010 OF oDlg COLOR CLR_BLACK, cColorBack REDEFINE URLLINK oLink ID 4011 URL "www.simtechsistemas.com.br" OF oDlg TOOLTIP "Click neste link para acessar a página da simtechsistemas Informática" oLink:SetColor( oLink:nClrInit, cColorBack ) ACTIVATE DIALOG oDlg NOWAIT ON INIT ( oObj:ajustaDialog( oDlg ), oTimer:activate() ) oFont:End() oFont2:End() // ---> Realizando o foco da última janela após a visualização de novas mensagens ///////////////////////////////////////////////////////////////////////////////// IF oLastDlg <> NIL oLastDlg:setFocus() ELSE ::oWnd:setFocus() ENDIF RETURN ********************************************************************************* ** Função....: animateDlg() * ** Objetivo..: Realizar uma determinada animação na dialog/window * ** Autor.....: Márcio Augusto Cezar * ** Data......: 20/10/2008 - 15:46:44 * ********************************************************************************* ** Parâmetros: oDlg --> Objeto dialog/window para controle da animação * ** cTipoAnimacao --> String contendo o tipo de animação a ser feita * ** de acordo com os tipos definidos pela API * ** nDuracao --> Velocidade a ser realizada a animação * ** lFechaDlg --> Expr. Lógica indicando se a Dialog/Window deverá * ** ser finalizada * ********************************************************************************* ** Retorno...: NIL * ********************************************************************************* FUNCTION animateDlg( oDlg, cTipoAnimacao, nDuracao, lFechaDlg ) DEFAULT cTipoAnimacao := "fadeIn", ; nDuracao := if( inArray( { "fadeOut", "fadeIn" }, cTipoAnimacao ), 1000, 200 ), ; lFechaDlg := .F. // ---> Realizando a animação apropriada, definida em cTipoAnimacao /////////////////////////////////////////////////////////////////// IF ( cTipoAnimacao == "fadeIn" ) animateWindow( oDlg:hWnd, nDuracao, AW_BLEND + AW_CENTER ) ELSEIF ( cTipoAnimacao == "fadeOut" ) IF ( animateWindow( oDlg:hWnd, nDuracao, AW_BLEND + AW_HIDE ) == 0 ) oDlg:hide() ENDIF ELSEIF ( cTipoAnimacao == "toUp" ) animateWindow( oDlg:hWnd, nDuracao, AW_VER_NEGATIVE ) ELSEIF ( cTipoAnimacao == "toDown" ) animateWindow( oDlg:hWnd, nDuracao, AW_VER_POSITIVE ) ELSEIF ( cTipoAnimacao == "fromLeft" ) animateWindow( oDlg:hWnd, nDuracao, AW_HOR_POSITIVE ) ELSEIF ( cTipoAnimacao == "fromRight" ) animateWindow( oDlg:hWnd, nDuracao, AW_HOR_NEGATIVE ) ENDIF // ---> Atualizando a dialog para objetos say/image /////////////////////////////////////////////////// oDlg:refresh() // ---> Verificando se a dialog deverá ser fechada /////////////////////////////////////////////////// if( lFechaDlg, oDlg:end(), ) RETURN( NIL ) ********************************************************************************* ** Função....: Funções de controle geral para Dialogs/Window a partir de API * ** Autor.....: Márcio Augusto Cezar * ** Data......: 13/06/2008 11:00:53 * ********************************************************************************* DLL FUNCTION animateWindow( hWnd AS LONG, dwTime AS LONG, dwFlags AS LONG ) AS LONG PASCAL ; FROM "AnimateWindow" LIB "user32.dll" DLL FUNCTION findWndByClass( wndClass AS LPSTR, wndName AS LPSTR ) AS LONG PASCAL ; FROM "FindWindowA" LIB "user32.dll" ********************************************************************************* ** Método....: inArray() * ** Objetivo..: Checa se determinado parâmetro encontra-se no array informado * ** Autor.....: Márcio Augusto Cezar * ** Data......: 20/10/2008 - 17:16:32 * ********************************************************************************* ** Observação: * ********************************************************************************* FUNCTION inArray( aVetor, uParametro, bBlocoCodigo ) LOCAL lInArray := .F. DEFAULT uParametro := "", ; aVetor := {}, ; bBlocoCodigo := NIL IF bBlocoCodigo == NIL lInArray := ( ascan( aVetor, { | uParam | uParam == uParametro } ) > 0 ) ELSE lInArray := ( ascan( aVetor, bBlocoCodigo ) > 0 ) ENDIF RETURN( lInArray ) Esta função checa se existe uma versão disponível no ftp e apresenta uma notificação no try. Você pode adaptar pra você. Quote Link to comment Share on other sites More sharing options...
alex2002 Posted July 21, 2022 Author Report Share Posted July 21, 2022 7 minutos atrás, macs disse: ******************************************************************************** ** Arquivo...: TCheckVersaoDisponivel.Prg * ******************************************************************************** ** Função....: TCheckVersaoDisponivel() * ** Objetivo..: Checar se existe uma versão disponível no site do sistema * ** Módulo....: Library * ** Autor.....: Márcio Augusto Cezar * ** Data......: 16/10/2008 17:16:03 * ******************************************************************************** ** Retorno...: * ******************************************************************************** ** Observação: Exemplo da chamada * ** TCheckVersaoDisponivel():new( oWnd, -> Window principal * ** BUILD, -> Versão atual do sistema * ** DT_VERSAO, -> Data da versão atual * ** cSiglaSys, -> Sigla do sistema * ** nome_empresa ) ->Senha da empresa * ** :Execute() -> Método que executa a classe * ** * ******************************************************************************** /* ** Definicoes para o tratamento de efeitos nas dialogs do sistema ** ** Informacoes de animação para API do windows **/ # Define AW_HOR_POSITIVE 1 && Animates the window from left to right. This flag can be used with roll or slide animation. # Define AW_HOR_NEGATIVE 2 && Animates the window from right to left. This flag can be used with roll or slide animation. # Define AW_VER_POSITIVE 4 && Animates the window from top to bottom. This flag can be used with roll or slide animation. # Define AW_VER_NEGATIVE 8 && Animates the window from bottom to top. This flag can be used with roll or slide animation. # Define AW_CENTER 16 && Makes the window appear to collapse inward if AW_HIDE is used or expand outward if the AW_HIDE is not used. # Define AW_HIDE 65536 && Hides the window. By default, the window is shown. # Define AW_ACTIVATE 131072 && Activates the window. # Define AW_SLIDE 262144 && Uses slide animation. By default, roll animation is used. # Define AW_BLEND 524288 && Uses a fade effect. This flag can be used only if hwnd is a top-level window. # Include "FiveWin.Ch" # Include "HBXml.Ch" # Include "FileIO.Ch" # Include "URLLink.Ch" CLASS TCheckVersaoDisponivel PRIVATE: DATA aOcorrencias AS ARRAY DATA cVersaoAtual ,; cVersaoDisponivel ,; cSiglaSistema ,; cSenhaEmpresa ,; cNomeEmpresa ,; cTituloDialog AS CHARACTER DATA cLink ,; cFileVersion ,; cResources AS CHARACTER DATA dDataVersaoAtual ,; dDataVersaoDisponivel AS DATE DATA lSistemaAtivo ,; lForceVisualizacao AS LOGIC DATA oWnd AS OBJECT METHOD getLink() INLINE ::cLink := "http://www.????????????????senha=" + alltrim( ::cSenhaEmpresa ) METHOD putVersaoFile() METHOD dialogMensagem() PUBLIC: METHOD new( oWnd, cVersaoAtual, dDataVersaoAtual, cSiglaSistema, cEmpresa, cTituloDialog ) CONSTRUCTOR METHOD end() INLINE ( PostMessage( self, WM_CLOSE ) ) //setResources( ::cResources ) METHOD execute( lViewDadosLink ) METHOD getSistemaAtivo() INLINE ( ::lSistemaAtivo ) METHOD getVersaoDisponivel() INLINE ( ::cVersaoDisponivel ) METHOD getDataVersao() INLINE ( ::dDataVersaoDisponivel ) METHOD getOcorrencias() INLINE ( ::aOcorrencias ) METHOD ajustaDialog( oDlg ) ENDCLASS ********************************************************************************* ** Método....: new() * ** Objetivo..: Método construtor da classe * ** Autor.....: Márcio Augusto Cezar * ** Data......: 16/10/2008 17:23:19 * ********************************************************************************* ** Observação: * ********************************************************************************* METHOD new( oWnd, cVersaoAtual, dDataVersaoAtual, cSiglaSistema, cEmpresa, cTituloDialog, lForceVisualizacao ) CLASS TCheckVersaoDisponivel DEFAULT cTituloDialog := "Existe uma nova versão disponível para o sistema" DEFAULT lForceVisualizacao := .F. ::oWnd := oWnd ::cResources := getResources() ::cVersaoAtual := alltrim( cVersaoAtual ) ::cSiglaSistema := cSiglaSistema ::cSenhaEmpresa := PassWord( alltrim( cEmpresa ) ) ::dDataVersaoAtual := dDataVersaoAtual ::cTituloDialog := cTituloDialog + " " + cSiglaSistema ::cVersaoDisponivel := "" ::dDataVersaoDisponivel := ctod("") ::lForceVisualizacao := lForceVisualizacao ::cFileVersion := "SystemVer.Txt" RETURN self ********************************************************************************* ** Método....: putVersaoFile() * ** Objetivo..: Escreve a versão do sistema no arquivo XML * ** Autor.....: Márcio Augusto Cezar * ** Data......: 16/10/2008 17:43:11 * ********************************************************************************* ** Observação: * ********************************************************************************* METHOD putVersaoFile() LOCAL oHttp, oUrl IF file( ::cFileVersion ) FErase( ::cFileVersion ) ENDIF oUrl := TUrl():New( ::getLink() ) oHttp := TIPClient():New( oUrl ) oHttp:nConnTimeout := 1000 oHttp:nDefaultPort := 9600 // Gravando no arquivo! /////////////////////// IF oHttp:Open() IF ! oHttp:ReadToFile( ::cFileVersion, FC_NORMAL, 300 ) // msgStop( "Não foi possível criar o arquivo " + ::cFileVersion ) ENDIF ENDIF IF oHttp <> Nil oHttp:Close() ENDIF RETURN file( ::cFileVersion ) ********************************************************************************* ** Método....: Execute() * ** Objetivo..: Executar os procedimentos da classe * ** Autor.....: Márcio Augusto Cezar * ** Data......: 16/10/2008 17:27:39 * ********************************************************************************* ** Observação: * ********************************************************************************* METHOD execute( lViewDadosLink ) CLASS TCheckVersaoDisponivel LOCAL oFile, oXML, oNode, oIter LOCAL aLines := {} DEFAULT lViewDadosLink := .F. ::aOcorrencias := {} BEGIN SEQUENCE // Checando se existe conectividade com a internet ////////////////////////////////////////////////// IF ! ChecaInternet( "www.simtechsistemas.com.br" ) aAdd( ::aOcorrencias, "Não há conexão com a Internet" ) ENDIF IF ! ::putVersaoFile() aAdd( ::aOcorrencias, "Não foi possível gravar o registro de versão no arquivo XML" ) ENDIF TRY oFile := TTxtFile():new( ::cFileVersion ) CATCH aAdd( ::aOcorrencias, "Erro na abertura do arquivo XML" ) END IF FError() <> 0 ::aAdd( ::aOcorrencias, "Erro na abertura do arquivo XML" ) ENDIF IF len( ::aOcorrencias ) <> 0 BREAK ENDIF WHILE ! oFile:lEof() aAdd( aLines, oFile:readLine() ) oFile:Skip() ENDDO oFile:close() IF lViewDadosLink mytoString( aLines ) ENDIF IF len( aLines ) > 0 IF ! ( ::lSistemaAtivo := "ATIVO" $ upper( aLines[01] ) ) BREAK ENDIF ::cNomeEmpresa := aLines[02] FOR nX := 3 TO len( aLines ) IF left( aLines[ nX ], 3 ) == ::cSiglaSistema ::cVersaoDisponivel := subStr( aLines[ nX ], at( "-", aLines[ nX ] ) + 1 ) ::cVersaoDisponivel := alltrim( subStr( ::cVersaoDisponivel, 1, at( "-", ::cVersaoDisponivel ) - 1 ) ) ::dDataVersaoDisponivel := ctod( alltrim( subStr( aLines[ nX ], rat( "-", aLines[ nX ] ) + 1 ) ) ) ENDIF NEXT ENDIF IF ( ::cVersaoDisponivel > ::cVersaoAtual .OR. ::dDataVersaoDisponivel > ::dDataVersaoAtual ) .OR. ::lForceVisualizacao // Exibindo a mensagem na tela ////////////////////////////// ::dialogMensagem() ENDIF END SEQUENCE RETURN ( len( ::aOcorrencias ) == 0 ) ********************************************************************************* ** Método....: ajustaDialog() * ** Objetivo..: Ajustar posicionamento de uma determinada dialog em relação à * ** janela principal * ** Autor.....: Márcio Augusto Cezar * ** Data......: 20/10/2008 - 16:25:22 * ********************************************************************************* ** Parâmetros: oDlg --> Objeto dialog que será ajustado * ********************************************************************************* METHOD ajustaDialog( oDlg ) CLASS TCheckVersaoDisponivel LOCAL aCoorsWnd := { 0, 0 } LOCAL nTopWnd := 0 LOCAL nLeftWnd := 0 // ---> Recuperando as coordenadas da dialog e da janela pai //////////////////////////////////////////////////////////// aCoorsWnd := clientToScreen( ::oWnd:hWnd, aCoorsWnd ) nTopWnd := ( ( aCoorsWnd[1] + ::oWnd:nHeight ) - oDlg:nHeight ) - 77 nLeftWnd := ( ::oWnd:nWidth() - oDlg:nWidth() ) - 8 // ---> Posicionando a dialog ///////////////////////////// oDlg:move( nTopWnd, nLeftWnd,,, .T. ) ::oWnd:setFocus() RETURN ********************************************************************************* ** Método....: dialogMensagem() * ** Objetivo..: Configuração da dialog da mensagem * ** Autor.....: Márcio Augusto Cezar * ** Data......: 20/10/2008 - 16:14:07 * ********************************************************************************* ** Observação: * ********************************************************************************* METHOD dialogMensagem() CLASS TCheckVersaoDisponivel LOCAL oDlg, oFont, oFont2, oLastDlg, oTimer, oLink LOCAL oObj := self LOCAL cColorBack := 16768959 LOCAL cColorText1 := CLR_BLACK LOCAL cColorText2 := CLR_BLUE LOCAL cColorText3 := 106 // ---> Salvando a última janela ativa antes da mensagem //////////////////////////////////////////////////////// oLastDlg := oWndFromhWnd( getActiveWindow() ) setResources( "Comum.Dll" ) DEFINE DIALOG oDlg RESOURCE "CHK_NOVA_VERSAO" OF ::oWnd COLOR CLR_BLACK, cColorBack oFont := TFont():New( "MS Sans Serif", 0, 15,, .T. ) oFont2 := TFont():New( "Courier" , 0, 12,, .T. ) // ---> Criando o timer para close automatico da dialog /////////////////////////////////////////////////////// oTimer := TTimer():new( 10000, { || animateDlg( oDlg, "fadeOut",, .T. ), oTimer:end() }, oObj:oWnd ) REDEFINE SAY ID 4001 OF oDlg COLOR 22784 , cColorBack FONT oFont PROMPT ::cTituloDialog REDEFINE SAY ID 4002 OF oDlg COLOR cColorText1, cColorBack FONT oFont2 PROMPT ::cVersaoAtual REDEFINE SAY ID 4003 OF oDlg COLOR cColorText1, cColorBack FONT oFont2 PROMPT ::dDataVersaoAtual REDEFINE SAY ID 4004 OF oDlg COLOR cColorText2, cColorBack FONT oFont2 PROMPT ::cVersaoDisponivel REDEFINE SAY ID 4005 OF oDlg COLOR cColorText2, cColorBack FONT oFont2 PROMPT ::dDataVersaoDisponivel REDEFINE SAY ID 4006 OF oDlg COLOR cColorText3, cColorBack REDEFINE SAY ID 4007 OF oDlg COLOR cColorText3, cColorBack REDEFINE SAY ID 4008 OF oDlg COLOR cColorText3, cColorBack REDEFINE SAY ID 4009 OF oDlg COLOR cColorText3, cColorBack REDEFINE SAY ID 4010 OF oDlg COLOR CLR_BLACK, cColorBack REDEFINE URLLINK oLink ID 4011 URL "www.simtechsistemas.com.br" OF oDlg TOOLTIP "Click neste link para acessar a página da simtechsistemas Informática" oLink:SetColor( oLink:nClrInit, cColorBack ) ACTIVATE DIALOG oDlg NOWAIT ON INIT ( oObj:ajustaDialog( oDlg ), oTimer:activate() ) oFont:End() oFont2:End() // ---> Realizando o foco da última janela após a visualização de novas mensagens ///////////////////////////////////////////////////////////////////////////////// IF oLastDlg <> NIL oLastDlg:setFocus() ELSE ::oWnd:setFocus() ENDIF RETURN ********************************************************************************* ** Função....: animateDlg() * ** Objetivo..: Realizar uma determinada animação na dialog/window * ** Autor.....: Márcio Augusto Cezar * ** Data......: 20/10/2008 - 15:46:44 * ********************************************************************************* ** Parâmetros: oDlg --> Objeto dialog/window para controle da animação * ** cTipoAnimacao --> String contendo o tipo de animação a ser feita * ** de acordo com os tipos definidos pela API * ** nDuracao --> Velocidade a ser realizada a animação * ** lFechaDlg --> Expr. Lógica indicando se a Dialog/Window deverá * ** ser finalizada * ********************************************************************************* ** Retorno...: NIL * ********************************************************************************* FUNCTION animateDlg( oDlg, cTipoAnimacao, nDuracao, lFechaDlg ) DEFAULT cTipoAnimacao := "fadeIn", ; nDuracao := if( inArray( { "fadeOut", "fadeIn" }, cTipoAnimacao ), 1000, 200 ), ; lFechaDlg := .F. // ---> Realizando a animação apropriada, definida em cTipoAnimacao /////////////////////////////////////////////////////////////////// IF ( cTipoAnimacao == "fadeIn" ) animateWindow( oDlg:hWnd, nDuracao, AW_BLEND + AW_CENTER ) ELSEIF ( cTipoAnimacao == "fadeOut" ) IF ( animateWindow( oDlg:hWnd, nDuracao, AW_BLEND + AW_HIDE ) == 0 ) oDlg:hide() ENDIF ELSEIF ( cTipoAnimacao == "toUp" ) animateWindow( oDlg:hWnd, nDuracao, AW_VER_NEGATIVE ) ELSEIF ( cTipoAnimacao == "toDown" ) animateWindow( oDlg:hWnd, nDuracao, AW_VER_POSITIVE ) ELSEIF ( cTipoAnimacao == "fromLeft" ) animateWindow( oDlg:hWnd, nDuracao, AW_HOR_POSITIVE ) ELSEIF ( cTipoAnimacao == "fromRight" ) animateWindow( oDlg:hWnd, nDuracao, AW_HOR_NEGATIVE ) ENDIF // ---> Atualizando a dialog para objetos say/image /////////////////////////////////////////////////// oDlg:refresh() // ---> Verificando se a dialog deverá ser fechada /////////////////////////////////////////////////// if( lFechaDlg, oDlg:end(), ) RETURN( NIL ) ********************************************************************************* ** Função....: Funções de controle geral para Dialogs/Window a partir de API * ** Autor.....: Márcio Augusto Cezar * ** Data......: 13/06/2008 11:00:53 * ********************************************************************************* DLL FUNCTION animateWindow( hWnd AS LONG, dwTime AS LONG, dwFlags AS LONG ) AS LONG PASCAL ; FROM "AnimateWindow" LIB "user32.dll" DLL FUNCTION findWndByClass( wndClass AS LPSTR, wndName AS LPSTR ) AS LONG PASCAL ; FROM "FindWindowA" LIB "user32.dll" ********************************************************************************* ** Método....: inArray() * ** Objetivo..: Checa se determinado parâmetro encontra-se no array informado * ** Autor.....: Márcio Augusto Cezar * ** Data......: 20/10/2008 - 17:16:32 * ********************************************************************************* ** Observação: * ********************************************************************************* FUNCTION inArray( aVetor, uParametro, bBlocoCodigo ) LOCAL lInArray := .F. DEFAULT uParametro := "", ; aVetor := {}, ; bBlocoCodigo := NIL IF bBlocoCodigo == NIL lInArray := ( ascan( aVetor, { | uParam | uParam == uParametro } ) > 0 ) ELSE lInArray := ( ascan( aVetor, bBlocoCodigo ) > 0 ) ENDIF RETURN( lInArray ) Esta função checa se existe uma versão disponível no ftp e apresenta uma notificação no try. Você pode adaptar pra você. Obrigado meu amigo. Vou dar uma estudada aqui. Valeu. Um abraço, Alexandre Pereira Quote Link to comment Share on other sites More sharing options...
Jmsilva Posted July 21, 2022 Report Share Posted July 21, 2022 4 horas atrás, alex2002 disse: Olá meu amigo. Na verdade o que a classe faz é um menu, eu queria que na notificação me desse a oportunidade de executar uma função, quando clicado. Exatamente os antivírus, atualizações nos permitem fazer. Enfim, vou notificar o usuário com shellnotify e se o cara clicar executaria uma determinada função. Creio não ser possível porque a o shellnotify na verdade é uma function das DLLs do windows, por isso acho não ser possível. Mas de qualquer forma, se existir estamos dentro. Um abraço, Alexandre Pereira O Exemplo peguei do Fivewin, no caso exibe um menu, vc pode sim implementar e fazer o que vc desejar, acrescentado na sua rotina timer, ele fica monitorando, em um intervalo de tempo desejado, por exemplo, uma versão nova no servidor ou qq outra informação e se desejar, além da notificação, poderá exibir uma tela para tal processamento. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted July 22, 2022 Report Share Posted July 22, 2022 http://forums.fivetechsupport.com/viewtopic.php?f=6&t=41847&p=250878&hilit=tray&sid=dbb52cb5fb3423e64637babeb8f80256#p250878 Windows Notification Service http://forums.fivetechsupport.com/viewtopic.php?f=3&t=41104&p=246132&hilit=message&sid=dbb52cb5fb3423e64637babeb8f80256#p246132 Regards, saludos. Quote Link to comment Share on other sites More sharing options...
Eric.Developer Posted July 23, 2022 Report Share Posted July 23, 2022 Fácil. Apenas use TTrayIcon da forma correta (acho que ninguém entendeu o que precisa). Se quiser a minha consultoria/solução, meus dados e-mail/Messenger (neste caso, sem taxa do orçamento). Atenciosamente, Site | Facebook | YouTube Em 20/07/2022 at 00:51, alex2002 disse: Olá PessoALL, Alguém saberia me dizer se consigo fazer uma associação de uma função xHarbour para ser utilizada na notificação do Windows (aquela mesma do tray já comentado aqui no grupo)? Pergunto pois, se o sistema notificar o usuário dentro do sistema, queria abrir uma janela caso o usuário clique na notificação. Exatamente igual existe para atualizações do Java, etc. Não sei se é possível, mas se for será de granda valia pra mim. Um abraço, Alexandre Pereira Quote Link to comment Share on other sites More sharing options...
Theotokos Posted July 25, 2022 Report Share Posted July 25, 2022 Em 23/07/2022 at 15:46, Eric.Developer disse: Fácil. Apenas use TTrayIcon da forma correta (acho que ninguém entendeu o que precisa). Se quiser a minha consultoria/solução, meus dados e-mail/Messenger (neste caso, sem taxa do orçamento). Atenciosamente, Site | Facebook | YouTube se nao vai cobrar, compartilha aqui então, pode ter mais pessoas interessadas, e acrescenta em muito para o forum... Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.