Mensagem na bandeja do windows com ShowNotifyInfo

Projeto HwGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Mensagem na bandeja do windows com ShowNotifyInfo

Mensagem por asimoes »

Senhores,

Com a minigui eu tenho um sistema monitor que fica no tray (bandeja) do windows. Quando há algum evento no sistema eu notifico no tray com uma mensagem do evento usando a função abaixo:

Existe algo parecido em hwgui?

Código: Selecionar todos

PROCEDURE MsgBalloon( cMessage, cTitle )
LOCAL i := Ascan( _HMG_aFormhandles, GetFormHandle("Form_1") )
Default cMessage := "Prompt", cTitle := PROGRAM
ShowNotifyInfo( _HMG_aFormhandles[i], .F. , NIL, NIL, NIL, NIL )
ShowNotifyInfo( _HMG_aFormhandles[i], .T. , LoadTrayIcon( GetInstance(), ;
		_HMG_aFormNotifyIconName[i] ), _HMG_aFormNotifyIconToolTip[i], cMessage, cTitle )
RETURN Nil

Código: Selecionar todos

*-----------------------------------------------------------------------------*
/*
 * C-level
*/
#pragma BEGINDUMP

#define _WIN32_IE      0x0500
#define HB_OS_WIN_32_USED
#define _WIN32_WINNT   0x0400
#include <shlobj.h>

#include <windows.h>
#include <commctrl.h>
#include "hbapi.h"

static void ShowNotifyInfo(HWND hWnd, BOOL bAdd, HICON hIcon, LPSTR szText, LPSTR szInfo, LPSTR szInfoTitle);

HB_FUNC ( SHOWNOTIFYINFO )
{
	ShowNotifyInfo( (HWND) hb_parnl(1), (BOOL) hb_parl(2), (HICON) hb_parnl(3), (LPSTR) hb_parc(4), 
			(LPSTR) hb_parc(5), (LPSTR) hb_parc(6) );
}

static void ShowNotifyInfo(HWND hWnd, BOOL bAdd, HICON hIcon, LPSTR szText, LPSTR szInfo, LPSTR szInfoTitle)
{
	NOTIFYICONDATA nid;

	ZeroMemory( &nid, sizeof(nid) );

	nid.cbSize		 = sizeof(NOTIFYICONDATA);
	nid.hIcon		 = hIcon;
	nid.hWnd		    = hWnd;
	nid.uID			 = 0;
	nid.uFlags		 = NIF_INFO | NIF_TIP | NIF_ICON;
	nid.dwInfoFlags = NIIF_INFO;

	lstrcpy( nid.szTip, TEXT(szText) );
	lstrcpy( nid.szInfo, TEXT(szInfo) );
	lstrcpy( nid.szInfoTitle, TEXT(szInfoTitle) );

	if(bAdd)
		Shell_NotifyIcon( NIM_ADD, &nid );
	else
		Shell_NotifyIcon( NIM_DELETE, &nid );

	if(hIcon)
		DestroyIcon( hIcon );
}

#pragma ENDDUMP


#pragma BEGINDUMP

#define HB_OS_WIN_32_USED
#define _WIN32_WINNT   0x0400
#include <windows.h>
#include "hbapi.h"
#include "hbapiitm.h"

/*HB_FUNC( DRAWICON )
{   HWND hwnd;
    HDC hdc;

    hwnd  = (HWND) hb_parnl( 1 ) ;
    hdc   = GetDC( hwnd ) ;
 
    hb_retl( DrawIcon( (HDC) hdc , hb_parni( 2 ) , hb_parni( 3 ) , (HICON) hb_parnl( 4 ) ) ) ;
    ReleaseDC( hwnd, hdc ) ;
} */

HB_FUNC( SHOWERROR )

{
   LPVOID lpMsgBuf;
   DWORD dwError  = GetLastError();

   FormatMessage( 
      FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
      NULL,
      dwError,
      MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
      (LPTSTR) &lpMsgBuf,
      0,
      NULL 
   );
   
   MessageBox(NULL, (LPCSTR)lpMsgBuf, "Shutdown", MB_OK | MB_ICONEXCLAMATION);
   // Free the buffer.
   LocalFree( lpMsgBuf );
}

HB_FUNC( ENABLEPERMISSIONS )

{
   LUID tmpLuid;
   TOKEN_PRIVILEGES tkp, tkpNewButIgnored;
   DWORD lBufferNeeded;
   HANDLE hdlTokenHandle;
   HANDLE hdlProcessHandle = GetCurrentProcess();

   OpenProcessToken(hdlProcessHandle, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hdlTokenHandle);

   LookupPrivilegeValue(NULL, "SeShutdownPrivilege", &tmpLuid);

   tkp.PrivilegeCount            = 1;
   tkp.Privileges[0].Luid        = tmpLuid;
   tkp.Privileges[0].Attributes  = SE_PRIVILEGE_ENABLED;

   AdjustTokenPrivileges(hdlTokenHandle, FALSE, &tkp, sizeof(tkpNewButIgnored), &tkpNewButIgnored, &lBufferNeeded);
}

HB_FUNC( EXITWINDOWSEX )

{
   hb_retl( ExitWindowsEx( (UINT) hb_parni( 1 ), (DWORD) hb_parnl( 2 ) ) );
}

HB_FUNC( GETPRIVATEPROFILESTRING )
{
   TCHAR bBuffer[ 1024 ] = { 0 };
   DWORD dwLen ;
   char * lpSection = hb_parc( 1 );
   char * lpEntry = ISCHAR(2) ? hb_parc( 2 ) : NULL ;
   char * lpDefault = hb_parc( 3 );
   char * lpFileName = hb_parc( 4 );
   dwLen = GetPrivateProfileString( lpSection , lpEntry ,lpDefault , bBuffer, sizeof( bBuffer ) , lpFileName);
   if( dwLen )
     hb_retclen( ( char * ) bBuffer, dwLen );
   else
      hb_retc( lpDefault );
}

HB_FUNC( WRITEPRIVATEPROFILESTRING )
{
   char * lpSection = hb_parc( 1 );
   char * lpEntry = ISCHAR(2) ? hb_parc( 2 ) : NULL ;
   char * lpData = ISCHAR(3) ? hb_parc( 3 ) : NULL ;
   char * lpFileName= hb_parc( 4 );

   if ( WritePrivateProfileString( lpSection , lpEntry , lpData , lpFileName ) )
      hb_retl( TRUE ) ;
   else
      hb_retl(FALSE);
}

HB_FUNC( GETWINDOWTEXT )
{
   HWND hWnd   = ( HWND ) hb_parnl( 1 );
   int iLen    = GetWindowTextLength( hWnd );
   LPSTR pText;

   if( iLen > 0 )
   {
      pText = hb_xgrab( iLen + 1 );
      GetWindowText( hWnd, pText, iLen + 1 );
      hb_retclen( pText, iLen );
      hb_xfree( pText );
   }
   else
      hb_retc( "" );
}

HB_FUNC( LOADTRAYICON )
{
	HICON himage;
	HINSTANCE hInstance  = (HINSTANCE) hb_parnl(1);  // handle to application instance
	LPCTSTR   lpIconName = (LPCTSTR)   hb_parc(2);   // name string or resource identifier

	himage = (HICON) LoadImage( hInstance ,  lpIconName , IMAGE_ICON, 16, 16, LR_SHARED ) ;

	if (himage==NULL)
	{
		himage = (HICON) LoadImage( hInstance , lpIconName , IMAGE_ICON, 0, 0, LR_LOADFROMFILE + LR_DEFAULTSIZE ) ;
	}

	hb_retnl ( (LONG) himage );
}

HB_FUNC( LOADMAINICON )
{
	HICON himage;
	HINSTANCE hInstance  = (HINSTANCE) hb_parnl(1);  // handle to application instance
	LPCTSTR   lpIconName = (LPCTSTR)   hb_parc(2);   // name string or resource identifier

	himage = (HICON) LoadImage( hInstance , lpIconName , IMAGE_ICON, 0, 0, LR_DEFAULTSIZE ) ;

	if (himage==NULL)
	{
		himage = (HICON) LoadImage( hInstance , lpIconName , IMAGE_ICON, 0, 0, LR_LOADFROMFILE + LR_DEFAULTSIZE ) ;
	}

	hb_retnl ( (LONG) himage );
}

#pragma ENDDUMP 
[]´s
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Mensagem na bandeja do windows com ShowNotifyInfo

Mensagem por sygecom »

De uma olhada no exemplo abaixo e veja se é o que você precisa.

Código: Selecionar todos

*Leonardo Machado
#include "windows.ch"
#include "guilib.ch"
#include "hwgui.ch"
#include "common.ch"

*************
Function Main
*************
PRIVATE oMainWindow, oTrayMenu
PRIVATE oIcon := HIcon():AddResource("ICON_1")

INIT WINDOW oMainWindow MAIN TITLE "Servidor de Proteção"

CONTEXT MENU oTrayMenu
    MENUITEM "Configurações" ACTION {|| msginfo("aqui")}
    SEPARATOR
    MENUITEM "Sair" ACTION {|| Sair()}
ENDMENU

oMainWindow:InitTray(oIcon,,oTrayMenu,"Servidor de Proteção")
if Os_IsWinNT()
  *oMainWindow:handle
   ShowNotifyInfo( GetModalHandle() , .T. , "Servidor de Proteção" , NIL, "Inicio do Teste de Ballon","Titulo Numero 1" )
endif
ACTIVATE WINDOW oMainWindow NOSHOW
oTrayMenu:End()
Return Nil

*************
Function Sair
*************
IF MsgYesNo("Deseja Realmente Sair","Aviso do Sistema")
   oMainWindow:Close()
   quit
endif
Return

#pragma BEGINDUMP

#define _WIN32_IE      0x0500
#define HB_OS_WIN_32_USED
#define _WIN32_WINNT   0x0400
#include <shlobj.h>

#include <windows.h>
#include <commctrl.h>
#include "hbapi.h"

static void ShowNotifyInfo(HWND hWnd, BOOL bAdd, HICON hIcon, LPSTR szText, LPSTR szInfo, LPSTR szInfoTitle);

HB_FUNC ( SHOWNOTIFYINFO )
{
	ShowNotifyInfo( (HWND) hb_parnl(1), (BOOL) hb_parl(2), (HICON) hb_parnl(3), (LPSTR) hb_parc(4), 
			(LPSTR) hb_parc(5), (LPSTR) hb_parc(6) );
}

static void ShowNotifyInfo(HWND hWnd, BOOL bAdd, HICON hIcon, LPSTR szText, LPSTR szInfo, LPSTR szInfoTitle)
{
	NOTIFYICONDATA nid;

	ZeroMemory( &nid, sizeof(nid) );

	nid.cbSize		= sizeof(NOTIFYICONDATA);
	nid.hIcon		= hIcon;
	nid.hWnd		= hWnd;
	nid.uID			= 0;
	nid.uFlags		= NIF_INFO | NIF_TIP | NIF_ICON;
	nid.dwInfoFlags		= NIIF_INFO;

	lstrcpy( nid.szTip, TEXT(szText) );
	lstrcpy( nid.szInfo, TEXT(szInfo) );
	lstrcpy( nid.szInfoTitle, TEXT(szInfoTitle) );

	if(bAdd)
		Shell_NotifyIcon( NIM_ADD, &nid );
	else
		Shell_NotifyIcon( NIM_DELETE, &nid );

	if(hIcon)
		DestroyIcon( hIcon );
}

#pragma ENDDUMP
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Re: Mensagem na bandeja do windows com ShowNotifyInfo

Mensagem por asimoes »

Leonardo,

Obrigado pela resposta.
Funcionou o seu exemplo, o único problema é que a notificação não é feita em cima do icone do sistema no systray,
o comando abre outra área na barra com a mensagem.
Na minigui isso funciona certinho. Mas neste caso a aplicação foi feita com hwgui. Tentei mudar o código neste ponto:


if(bAdd)
Shell_NotifyIcon( NIM_ADD, &nid );
else
Shell_NotifyIcon( NIM_DELETE, &nid );

para:

if(bAdd)
Shell_NotifyIcon( NIM_MODIFY, &nid );
else
Shell_NotifyIcon( NIM_DELETE, &nid );

Mas não acontece nada. Só com NIM_ADD que notifica, sem icone.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Mensagem na bandeja do windows com ShowNotifyInfo

Mensagem por sygecom »

Realmente tem esse problema, tentei ajustar na corrida mas não achei solução. Por favor, Tente postar esse exemplo no Grupo da Hwgui para ver se algum desenvolvedor da Lib ajuda a resolver.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem na bandeja do windows com ShowNotifyInfo

Mensagem por alaminojunior »

Bom dia !

Gostaria de implementar algo do tipo em meu sistema, e testando o código mais abaixo, na compilação acusou o seguinte erro:
xHarbour Compiler build 1.2.3 (SimpLex) (Rev. 9721)
Copyright 1999-2012, http://www.xharbour.org http://www.harbour-project.org/
Compiling 'NOTIFY.PRG'...100...1600
Lines 37, Functions/Procedures 2
Generating C source output to 'obj\NOTIFY.c'...
Done.

Building object module for 'obj\NOTIFY.c'
using C compiler 'BCC32' as defined in 'C:\xHarbour\Bin\harbour.cfg'...
Exec: BCC32 -c -D__EXPORT__ -IC:\xHarbour\include -d -LC:\xHarbour\lib -oobj\NOTIFY.obj obj\NOTIFY.c
Embarcadero C++ 6.70 for Win32 Copyright (c) 1993-2013 Embarcadero Technologies, Inc.
obj\NOTIFY.c:
Error E2451 NOTIFY.PRG 69: Undefined symbol 'dwInfoFlags' in function ShowNotifyInfo
Error E2451 NOTIFY.PRG 72: Undefined symbol 'szInfo' in function ShowNotifyInfo
Error E2451 NOTIFY.PRG 73: Undefined symbol 'szInfoTitle' in function ShowNotifyInfo
*** 3 errors in Compile ***
Done.
Deleting: "obj\NOTIFY.c"
Done.
Vasculhando o MSDN, até onde conseguí entender, acrescentei as seguintes linhas e compilou !
#define NTDDI_VERSION NTDDI_WIN2K
#define NTDDI_VERSION NTDDI_WINXP
#define NTDDI_VERSION NTDDI_VISTA
O resultado foi o seguinte:
O aplicativo executa no systray, com ícone e tudo mais. Porém, o que seria interessante para mim no caso, é que em dada situação (estando a aplicação em execução) subir um balão como no Gmail, Outlook e outros com alguma informação.

Agradeço qualquer ajuda.

Obrigado.

Código: Selecionar todos

#include "windows.ch"
#include "guilib.ch"
#include "hwgui.ch"
#include "common.ch"

*************
Function Main
*************
PRIVATE oMainWindow, oTrayMenu
PRIVATE oIcon := HIcon():AddResource(100)

INIT WINDOW oMainWindow MAIN TITLE "Servidor de Proteção"

CONTEXT MENU oTrayMenu
    MENUITEM "Configurações" ACTION {|| msginfo("aqui")}
    SEPARATOR
    MENUITEM "Sair" ACTION {|| Sair()}
ENDMENU
oMainWindow:InitTray(oIcon,,oTrayMenu,"Servidor de Proteção")

if Os_IsWinNT()
   ShowNotifyInfo( oMainWindow:handle , .T. , NIL , NIL, "Inicio do Teste de Ballon","Titulo Numero 1" )
endif
ACTIVATE WINDOW oMainWindow NOSHOW
oTrayMenu:End()
Return Nil

*************
Function Sair
*************
IF MsgYesNo("Deseja Realmente Sair","Aviso do Sistema")
   oMainWindow:Close()
   quit
endif
Return

#pragma BEGINDUMP

#define _WIN32_IE      0x0500
#define HB_OS_WIN_32_USED
#define _WIN32_WINNT   0x0400
#include <shlobj.h>

#include <windows.h>
#include <commctrl.h>
#include "hbapi.h"

static void ShowNotifyInfo(HWND hWnd, BOOL bAdd, HICON hIcon, LPSTR szText, LPSTR szInfo, LPSTR szInfoTitle);

HB_FUNC ( SHOWNOTIFYINFO )
{
	ShowNotifyInfo( (HWND) hb_parnl(1), (BOOL) hb_parl(2), (HICON) hb_parnl(3), (LPSTR) hb_parc(4), 
			(LPSTR) hb_parc(5), (LPSTR) hb_parc(6) );
}

static void ShowNotifyInfo(HWND hWnd, BOOL bAdd, HICON hIcon, LPSTR szText, LPSTR szInfo, LPSTR szInfoTitle)
{
	NOTIFYICONDATA nid;

	ZeroMemory( &nid, sizeof(nid) );

	nid.cbSize		= sizeof(NOTIFYICONDATA);
	nid.hIcon		= hIcon;
	nid.hWnd		= hWnd;
	nid.uID			= 0;
	nid.uFlags		= NIF_INFO | NIF_TIP | NIF_ICON;
	nid.dwInfoFlags		= NIIF_INFO;

	lstrcpy( nid.szTip, TEXT(szText) );
	lstrcpy( nid.szInfo, TEXT(szInfo) );
	lstrcpy( nid.szInfoTitle, TEXT(szInfoTitle) );

	if(bAdd)
		Shell_NotifyIcon( NIM_ADD, &nid );
	else
		Shell_NotifyIcon( NIM_DELETE, &nid );

	if(hIcon)
		DestroyIcon( hIcon );
}

#pragma ENDDUMP
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

[RESOLVIDO] Mensagem na bandeja do windows com ShowNotifyInf

Mensagem por alaminojunior »

Boa tarde !

Após algumas alterações, eis que o recurso está funcionando.
Segue o código já alterado para quem quiser usar.

Código: Selecionar todos

#include "windows.ch"
#include "guilib.ch"
#include "hwgui.ch"
#include "common.ch"

Function notifi
Private oMainWindow, oTrayMenu, oTimer1
Private oIcon:= HIcon():AddResource(100)

INIT WINDOW oMainWindow MAIN TITLE "System Tray" ON INIT {|| MsgInfo('Eu aqui') }

SET TIMER oTimer1 OF oMainWindow VALUE 5000 ACTION  {|| teste() }

CONTEXT MENU oTrayMenu
    MENUITEM "Configurações" ACTION {|| msginfo("aqui")}
    SEPARATOR
    MENUITEM "Sair" ACTION {|| Sair()}
ENDMENU   

	oMainWindow:InitTray(oIcon,,oTrayMenu,"System tray")

ACTIVATE WINDOW oMainWindow NOSHOW

oTrayMenu:End()
Return

Static Function teste
if file('c:\sistemas\notify\teste.txt')
   ShowNotifyInfo( GetModalHandle() , .T. , "RECEBIMENTO" , 'TESTE', ' *** RECEBIDO *** ' ," MENSAGEM DA LOJA 001 " )
endif   
return .t.

Function Sair
*************
IF MsgYesNo("Deseja Realmente Sair","Aviso do Sistema")
   oMainWindow:Close()
   quit
endif
Return

#pragma BEGINDUMP

#define _WIN32_WINNT_NT4                    0x0400
#define _WIN32_WINNT_WIN2K                  0x0500
#define _WIN32_WINNT_WINXP                  0x0501
#define _WIN32_WINNT_WS03                   0x0502
#define _WIN32_WINNT_WIN6                   0x0600
#define _WIN32_WINNT_VISTA                  0x0600
#define _WIN32_WINNT_WS08                   0x0600
#define _WIN32_WINNT_LONGHORN               0x0600
#define _WIN32_WINNT_WIN7                   0x0601
#define _WIN32_IE_IE20                      0x0200
#define _WIN32_IE_IE30                      0x0300
#define _WIN32_IE_IE302                     0x0302
#define _WIN32_IE_IE40                      0x0400
#define _WIN32_IE_IE401                     0x0401
#define _WIN32_IE_IE50                      0x0500
#define _WIN32_IE_IE501                     0x0501
#define _WIN32_IE_IE55                      0x0550
#define _WIN32_IE_IE60                      0x0600
#define _WIN32_IE_IE60SP1                   0x0601
#define _WIN32_IE_IE60SP2                   0x0603
#define _WIN32_IE_IE70                      0x0700
#define _WIN32_IE_IE80                      0x0800
#define HB_OS_WIN_32_USED
#include <shlobj.h>
#include <windows.h>
#include <commctrl.h>
#include "hbapi.h"

static void ShowNotifyInfo(HWND hWnd, BOOL bAdd, HICON hIcon, LPSTR szText, LPSTR szInfo, LPSTR szInfoTitle);

HB_FUNC ( SHOWNOTIFYINFO )
{
ShowNotifyInfo( (HWND) hb_parnl(1), (BOOL) hb_parl(2), (HICON) hb_parnl(3), (LPSTR) hb_parc(4),
(LPSTR) hb_parc(5), (LPSTR) hb_parc(6) );
}

static void ShowNotifyInfo(HWND hWnd, BOOL bAdd, HICON hIcon, LPSTR szText, LPSTR szInfo, LPSTR szInfoTitle)
{
NOTIFYICONDATA nid;

ZeroMemory( &nid, sizeof(nid) );

nid.cbSize= sizeof(NOTIFYICONDATA);
nid.hIcon= hIcon;
nid.hWnd= hWnd;
nid.uID= 0;
nid.uFlags= NIF_INFO | NIF_TIP | NIF_ICON;
nid.dwInfoFlags= NIIF_INFO;

lstrcpy( nid.szTip, TEXT(szText) );
lstrcpy( nid.szInfo, TEXT(szInfo) );
lstrcpy( nid.szInfoTitle, TEXT(szInfoTitle) );

nid.uVersion = NOTIFYICON_VERSION_4;
if(bAdd)
   Shell_NotifyIcon( NIM_ADD, &nid );
else
   Shell_NotifyIcon( NIM_DELETE, &nid );

if(hIcon)
   DestroyIcon( hIcon );
}

#pragma ENDDUMP
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Mensagem na bandeja do windows com ShowNotifyInfo

Mensagem por asimoes »

Alamino,

Eu já tinha tentado desta forma, o problema é a mensagem fora do icone (icone sem imagem) na barra de tarefas.

Resolvi o problema alterando o código da hwgui que foi mais simples do que eu pensava.

Fontes para alterar:

hwindow.prg na pasta source no método initTray
cMens1 e cMens2 são as mensagens notificadoras para o icone.

Código: Selecionar todos


Alterar a assinatura do método no início do fonte: METHOD InitTray( oNotifyIcon, bNotify, oNotifyMenu, cTooltip, cMens1, cMens2 )

METHOD InitTray( oNotifyIcon, bNotify, oNotifyMenu, cTooltip, cMens1, cMens2 ) CLASS HMainWindow

   HB_Default(@cMens1,"")
   HB_Default(@cMens2,"")
   
   ::bNotify     := bNotify
   ::oNotifyMenu := oNotifyMenu
   ::oNotifyIcon := oNotifyIcon
   hwg_Shellnotifyicon( .T., ::handle, oNotifyIcon:handle, cTooltip, cMens1, cMens2)
   ::lTray := .T.

   RETURN Nil
shellapi.c

Modifiquei duas funções:

HWG_SHELLNOTIFYICON e HWG_SHELLMODIFYICON

Código: Selecionar todos


HB_FUNC( HWG_SHELLNOTIFYICON )
{
   NOTIFYICONDATA tnid;

   memset( ( void * ) &tnid, 0, sizeof( NOTIFYICONDATA ) );

   tnid.cbSize = sizeof( NOTIFYICONDATA );
   tnid.hWnd = ( HWND ) HB_PARHANDLE( 2 );
   tnid.uID = ID_NOTIFYICON;
   tnid.uFlags = NIF_ICON | NIF_INFO | NIF_MESSAGE | NIF_TIP;
   tnid.uCallbackMessage = WM_NOTIFYICON;
   tnid.hIcon = ( HICON ) HB_PARHANDLE( 3 );
   HB_ITEMCOPYSTR( hb_param( 4, HB_IT_ANY ), tnid.szTip, HB_SIZEOFARRAY( tnid.szTip ) );

   lstrcpy( tnid.szInfo, TEXT((LPSTR) hb_parc(5)) );
   lstrcpy( tnid.szInfoTitle, TEXT((LPSTR) hb_parc(6)) );

   if( ( BOOL ) hb_parl( 1 ) )
      Shell_NotifyIcon( NIM_ADD, &tnid );
   else
      Shell_NotifyIcon( NIM_DELETE, &tnid );
}

/*
  *  ShellModifyIcon( hWnd, hIcon, cTooltip )
  */

HB_FUNC( HWG_SHELLMODIFYICON )
{
   NOTIFYICONDATA tnid;

   memset( ( void * ) &tnid, 0, sizeof( NOTIFYICONDATA ) );

   tnid.cbSize = sizeof( NOTIFYICONDATA );
   tnid.hWnd = ( HWND ) HB_PARHANDLE( 1 );
   tnid.uID = ID_NOTIFYICON;
   
   if( HB_ISNUM( 2 ) || HB_ISPOINTER( 2 ) )
   {
      tnid.uFlags |= NIF_ICON;
      tnid.hIcon = ( HICON ) HB_PARHANDLE( 2 );
   }
   if( HB_ITEMCOPYSTR( hb_param( 3, HB_IT_ANY ),
                       tnid.szTip, HB_SIZEOFARRAY( tnid.szTip ) ) > 0 )
   {
      //tnid.uFlags |= NIF_TIP;
      tnid.uFlags |= NIF_INFO;
      tnid.uFlags |= NIF_TIP;
   }

   if( HB_ITEMCOPYSTR( hb_param( 4, HB_IT_ANY ),
                       tnid.szInfo, HB_SIZEOFARRAY( tnid.szInfo ) ) > 0 )
   {	
      lstrcpy( tnid.szInfo, TEXT((LPSTR) hb_parc(4)) );
      lstrcpy( tnid.szInfoTitle, TEXT((LPSTR) hb_parc(5)) );
   }
   
   Shell_NotifyIcon( NIM_MODIFY, &tnid );
}

Recompilar a hwgui.

Para testar as mensagens:

cMens1:="Iniciado"
cMens2:="Servidor NetIO"

oMainWindow:InitTray(oIcon,,oTrayMenu,cVersaoNetIO+" - "+c_SRVN+CRLF+cServidorDB+":"+cCaminhoSepara+CurDir(), cMens1, cMens2 )

Para colocar outras mensagens:

cTexto é o Tooltip

hwg_ShellModifyIcon( oMainWindow:handle, oIcon:handle, cTexto, cMens1, cMens2)
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem na bandeja do windows com ShowNotifyInfo

Mensagem por alaminojunior »

Bom dia Asimoes !

Realmente ainda ocorre este probleminha.
Vou fazer as mudanças conforme sugeriu.

Obrigado.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Mensagem na bandeja do windows com ShowNotifyInfo

Mensagem por asimoes »

Resultado:

Imagem
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Mensagem na bandeja do windows com ShowNotifyInfo

Mensagem por asimoes »

Uma pequena atualização:

Inclusão dos icones: Info, Warning e Error

* hwindow.prg

Código: Selecionar todos

#define NIIF_INFO       0x00000001
#define NIIF_WARNING    0x00000002
#define NIIF_ERROR      0x00000003

* Assinatura do método:
METHOD InitTray( oNotifyIcon, bNotify, oNotifyMenu, cTooltip, cMens1, cMens2, nIconIndex )

METHOD InitTray( oNotifyIcon, bNotify, oNotifyMenu, cTooltip, cMens1, cMens2, nIconIndex ) CLASS HMainWindow

   HB_Default(@cMens1,"")
   HB_Default(@cMens2,"")
   HB_Default(@nIconIndex,NIIF_INFO)
   
   ::bNotify     := bNotify
   ::oNotifyMenu := oNotifyMenu
   ::oNotifyIcon := oNotifyIcon
   hwg_Shellnotifyicon( .T., ::handle, oNotifyIcon:handle, cTooltip, cMens1, cMens2, nIconIndex )
   ::lTray := .T.

   RETURN Nil
* shellapi.c

Código: Selecionar todos

HB_FUNC( HWG_SHELLNOTIFYICON )
{
   NOTIFYICONDATA tnid;

   memset( ( void * ) &tnid, 0, sizeof( NOTIFYICONDATA ) );

   tnid.cbSize = sizeof( NOTIFYICONDATA );
   tnid.hWnd = ( HWND ) HB_PARHANDLE( 2 );
   tnid.uID = ID_NOTIFYICON;
   tnid.uFlags = NIF_ICON | NIF_INFO | NIF_MESSAGE | NIF_TIP;
   tnid.uCallbackMessage = WM_NOTIFYICON;
   tnid.dwInfoFlags = (DWORD) hb_parnl(7);
   tnid.hIcon = ( HICON ) HB_PARHANDLE( 3 );
   HB_ITEMCOPYSTR( hb_param( 4, HB_IT_ANY ), tnid.szTip, HB_SIZEOFARRAY( tnid.szTip ) );

   lstrcpy( tnid.szInfo, TEXT((LPSTR) hb_parc(5)) );
   lstrcpy( tnid.szInfoTitle, TEXT((LPSTR) hb_parc(6)) );

   if( ( BOOL ) hb_parl( 1 ) )
      Shell_NotifyIcon( NIM_ADD, &tnid );
   else
      Shell_NotifyIcon( NIM_DELETE, &tnid );
}

/*
  *  ShellModifyIcon( hWnd, hIcon, cTooltip )
  */

HB_FUNC( HWG_SHELLMODIFYICON )
{
   NOTIFYICONDATA tnid;

   memset( ( void * ) &tnid, 0, sizeof( NOTIFYICONDATA ) );

   tnid.cbSize = sizeof( NOTIFYICONDATA );
   tnid.hWnd = ( HWND ) HB_PARHANDLE( 1 );
   tnid.uID = ID_NOTIFYICON;
   
   if( HB_ISNUM( 2 ) || HB_ISPOINTER( 2 ) )
   {
      tnid.uFlags |= NIF_ICON;
      tnid.hIcon = ( HICON ) HB_PARHANDLE( 2 );
   }
   if( HB_ITEMCOPYSTR( hb_param( 3, HB_IT_ANY ),
                       tnid.szTip, HB_SIZEOFARRAY( tnid.szTip ) ) > 0 )
   {
      tnid.uFlags |= NIF_INFO;
      tnid.uFlags |= NIF_TIP;
   }

   tnid.dwInfoFlags = (DWORD) hb_parnl(6);
   
   if( HB_ITEMCOPYSTR( hb_param( 4, HB_IT_ANY ),
                       tnid.szInfo, HB_SIZEOFARRAY( tnid.szInfo ) ) > 0 )
   {	
      lstrcpy( tnid.szInfo, TEXT((LPSTR) hb_parc(4)) );
      lstrcpy( tnid.szInfoTitle, TEXT((LPSTR) hb_parc(5)) );
   }
   
   Shell_NotifyIcon( NIM_MODIFY, &tnid );
}
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem na bandeja do windows com ShowNotifyInfo

Mensagem por sygecom »

asimoes,

Passei só para agradecer, esses ajustes caiu como uma luva, perfeito. Muito obrigado por compartilhar conosco.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem na bandeja do windows com ShowNotifyInfo

Mensagem por alaminojunior »

sygecom escreveu:asimoes,

Passei só para agradecer, esses ajustes caiu como uma luva, perfeito. Muito obrigado por compartilhar conosco.
Fala Dr. !

Por acaso também estava eu a mexer com isso exatamente agora !

Realmente muito boa a contribuição do nosso colega.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Mensagem na bandeja do windows com ShowNotifyInfo

Mensagem por janio »

O código funciona perfeitamente! Muito obrigado!

Mas uma coisa q eu nunca havia prestado atenção: o balãozinho so desaparece se houver algum movimento com o mouse ou teclado do computador. Caso contrário, ele fica la até que um dos dois aconteça!

Eh isso mesmo?
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem na bandeja do windows com ShowNotifyInfo

Mensagem por sygecom »

Janio,
Para mim está funcionando perfeitamente, talvez por que minhas mensagem mudem umas 5 vez, depois some sozinha.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Responder