Página 1 de 1

Mensagem na bandeja do windows com ShowNotifyInfo

Enviado: 29 Abr 2011 09:24
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

Re: Mensagem na bandeja do windows com ShowNotifyInfo

Enviado: 29 Abr 2011 20:44
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

Re: Mensagem na bandeja do windows com ShowNotifyInfo

Enviado: 29 Abr 2011 21:55
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.

Re: Mensagem na bandeja do windows com ShowNotifyInfo

Enviado: 03 Mai 2011 19:04
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.

Mensagem na bandeja do windows com ShowNotifyInfo

Enviado: 19 Ago 2014 11:47
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

[RESOLVIDO] Mensagem na bandeja do windows com ShowNotifyInf

Enviado: 19 Ago 2014 17:17
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

Mensagem na bandeja do windows com ShowNotifyInfo

Enviado: 20 Ago 2014 09:29
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)

Mensagem na bandeja do windows com ShowNotifyInfo

Enviado: 20 Ago 2014 10:04
por alaminojunior
Bom dia Asimoes !

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

Obrigado.

Mensagem na bandeja do windows com ShowNotifyInfo

Enviado: 21 Ago 2014 07:50
por asimoes
Resultado:

Imagem

Mensagem na bandeja do windows com ShowNotifyInfo

Enviado: 25 Ago 2014 09:04
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 );
}

Mensagem na bandeja do windows com ShowNotifyInfo

Enviado: 22 Set 2015 12:52
por sygecom
asimoes,

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

Mensagem na bandeja do windows com ShowNotifyInfo

Enviado: 22 Set 2015 13:02
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.

Mensagem na bandeja do windows com ShowNotifyInfo

Enviado: 22 Set 2015 22:20
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?

Mensagem na bandeja do windows com ShowNotifyInfo

Enviado: 23 Set 2015 07:56
por sygecom
Janio,
Para mim está funcionando perfeitamente, talvez por que minhas mensagem mudem umas 5 vez, depois some sozinha.