No meu exemplo o sistema servidor foi compilado com harbour (3.1) + hwgui(svn) + mingw(32)
(*)Faça as modificações que achar necessárias. O servidor.exe deve ser executado na inicialização do windows.
Código: Selecionar todos
#include "hwgui.ch"
#include "common.ch"
#include "windows.ch"
#include "guilib.ch"
#include "windows.ch"
FUNCTION Main( nPort, cIfAddr, cRootDir, xRPC, ... )
LOCAL oTrayMenu
LOCAL nTentativa:=1
PRIVATE cFileLog:="SERVIDOR.LOG"
PRIVATE oIconIni:=HIcon():AddResource("ICON_2")
PRIVATE hWrite:=Hash(), hRead:=HB_ReadIni( "NETIOSERVER.INI" )
PRIVATE cFileIni:= "NETIOSERVER.INI"
PRIVATE cCaminhoSepara:=HB_OSpathseparator()
PRIVATE pListenSocket, c_Port:="2813", c_Path:=cCaminhoSepara+"DB", c_Addr:=Verifica_Ip(), c_SRVN:=""
PRIVATE nIcon :=Nil
PRIVATE CRLF :=HB_OsNewLine()
PRIVATE oIcon1 :=HIcon():AddResource("ICON_1")
PRIVATE oIcon2 :=HIcon():AddResource("ICON_2")
PRIVATE oMainWindow:=Nil
PRIVATE oTimer :=Nil
PRIVATE nIcon :=Nil
*REQUEST __HB_EXTERN__ //Adiciona todas as funções do harbour.
IF !File(cFileIni)
hWrite["MAIN" ] := Hash()
hWrite["MAIN" ]["Desc" ] := "Servidor - NetIO - 2011"
hWrite["MAIN" ]["Ver" ] := "Versao 2.0"
hWrite["CONFIGURACAO" ] := Hash()
hWrite["CONFIGURACAO" ]["Port"] := c_Port
hWrite["CONFIGURACAO" ]["Path"] := c_Path
hWrite["CONFIGURACAO" ]["Addres"] := c_Addr
hWrite["CONFIGURACAO" ]["Servidor"] := c_SRVN
HB_WriteIni( cFileIni, hWrite,"--- Inicio ---", "--- Fim ---" )
ELSE
c_Port:=hRead["CONFIGURACAO"]["Port"]
c_Path:=hRead["CONFIGURACAO"]["Path"]
c_Addr:=hRead["CONFIGURACAO"]["Addres"]
c_SRVN:=hRead["CONFIGURACAO"]["Servidor"]
ENDIF
pListenSocket := NetIO_mtServer( Val(c_Port),c_Addr,,.T.,"senha")
NetIO_Listen( Val(c_Port),c_Addr)
//IF Empty(pListenSocket)
// Liberar()
//ENDIF
//NETIO_MTSERVER( [<nPort>], [<cIfAddr>], [<cRootDir>], [<lRPC>],[<cPasswd>], [<nCompressionLevel>], [<nStrategy>] )
DO WHILE Empty(pListenSocket)
IF nTentativa > 3
MsgInfo( "Servidor não pode ser inicializado em "+c_Addr+":"+c_Port+" ou já está em uso.")
Liberar()
ENDIF
c_Addr:=Verifica_Ip()
//c_Port:=LTrim(Str(Val(c_Port)+1))
pListenSocket := NetIO_mtServer( Val(c_Port),c_Addr,,.T.,"senha")
nTentativa++
ENDDO
IF c_Addr <> Verifica_Ip()
AtualizaIni()
ENDIF
cServidorDB:='//'+c_Addr+':'+c_Port+'/'
INIT WINDOW oMainWindow MAIN TITLE "Servidor NetIO - "+cServidorDB
CONTEXT MENU oTrayMenu
MENUITEM "Parar o Servidor" ACTION PararServidor()
MENUITEM "Reiniciar o Servidor" ACTION IniciarServidor()
MENUITEM "Testar IP" ACTION {||c_Addr:="127.0.0.1"}
MENUITEM "Sobre" ACTION MsgInfo("Servidor NetIO"+CRLF+;
"Desenvolvido por Alexandre Simões"+CRLF+;
"asimoesluz@gmail.com")
SEPARATOR
MENUITEM "Sair" ACTION Sair()
ENDMENU
Liga_Timer(oMainWindow,.T.)
//ShowNotifyInfo( oMainWindow:handle, .T. , oIconIni:handle, NIL,"Servidor NetIO Iniciado","Sistema Exemplo")
GravaLog(cFileLog,HB_DTOC(Date(),"DD/MM/YYYY")+" "+Time()+": SERVIDOR NETIO INICIADO")
oMainWindow:InitTray( oIconIni,,oTrayMenu,"Servidor NetIO (r2011-05) - "+c_SRVN+CRLF+cServidorDB+":"+cCaminhoSepara+CurDir() )
//ShowNotifyInfo( GetModalHandle() , .T. , "Servidor NetIO (r2011-05) - "+c_SRVN+CRLF+cServidorDB+":"+cCaminhoSepara+CurDir() , NIL, "Servidor NetIO Iniciado","Harbour - NetIO" )
//ShowNotifyInfo( GetModalHandle(1) , .T. , "Servidor NetIO (r2011-05) - "+c_SRVN+CRLF+cServidorDB+":"+cCaminhoSepara+CurDir() , NIL, "Servidor NetIO Iniciado","Harbour - NetIO" )
ACTIVATE WINDOW oMainWindow NOSHOW
oTrayMenu:End()
RETURN Nil
FUNCTION MudaIcone
MEMVAR oMainWindow
MEMVAR oIcon1
MEMVAR oIcon2
Liga_Timer(oMainWindow,.F.)
IF c_Addr <> Verifica_Ip()
GravaLog(cFileLog,HB_DTOC(Date(),"DD/MM/YYYY")+" "+Time()+": SERVIDOR NETIO PARADO POR TROCA DE IP "+c_Addr)
c_Addr:=Verifica_Ip()
PararServidor()
pListenSocket := NetIO_mtServer( Val(c_Port),c_Addr,,.T.,"senha")
GravaLog(cFileLog,HB_DTOC(Date(),"DD/MM/YYYY")+" "+Time()+": SERVIDOR NETIO REINICIADO COM IP "+c_Addr)
AtualizaIni()
cServidorDB:='//'+c_Addr+':'+c_Port+'/'
ENDIF
IF ValType(nIcon) == "U"
//ShowNotifyInfo( _HMG_aFormhandles[i], .T. , LoadTrayIcon( GetInstance(), _HMG_aFormNotifyIconName[i] ), _HMG_aFormNotifyIconToolTip[i], cMessage, cTitle )
//ShowNotifyInfo( oMainWindow:handle, .F. , NIL, NIL, NIL, NIL )
//ShowNotifyInfo( oMainWindow:handle, .T. , oIcon2:handle, "teste 1", "teste 2", "teste 3" )
//ShowNotifyInfo( oMainWindow:handle, .T. , oIcon2:handle, "","TESTE",)
nIcon:=1
ENDIF
nIcon := IF(nIcon > 2, 1, nIcon)
Muda_Icone(IF(nIcon=1,oIcon1,oIcon2),"Servidor NetIO (r2011-05) - "+c_SRVN+CRLF+cServidorDB+":"+cCaminhoSepara+CurDir())
nIcon++
Liga_Timer(oMainWindow,.T.)
RETURN Nil
FUNCTION GravaLog(cFile,cEvento)
StrFile(cEvento+CRLF,cFile,.T.)
RETURN NIl
FUNCTION Muda_Icone(oIconeX, cTexto)
LOCAL oIcon:=oIconeX
MEMVAR oMainWindow
ShellModifyIcon( oMainWindow:handle, oIcon:handle, cTexto)
oMainWindow:Refresh()
RETURN Nil
FUNCTION Liga_Timer(oJanela,lLiga)
MEMVAR oTimer
IF lLiga
SET TIMER oTimer of oJanela VALUE 5000 ACTION {|| MudaIcone() }
ELSE
oJanela:oTimer:End()
ENDIF
RETURN Nil
FUNCTION Sair
MEMVAR oMainWindow
Liga_Timer(oMainWindow,.F.)
oMainWindow:oTimer:End()
//IF MsgNoYes("Encerrar o servidor ?","Aviso do Sistema")
PararServidor(.T.)
ShowNotifyInfo( oMainWindow:handle, .F. , NIL, NIL, NIL, NIL )
Liberar()
//ELSE
// Liga_Timer(oMainWindow,.T.)
// RETURN Nil
//ENDIF
RETURN Nil
FUNCTION Liberar
EndWindow()
ExitProcess()
RETURN Nil
FUNCTION PararServidor(lSaida)
MEMVAR pListenSocket
DEFAULT lSaida TO .F.
IF !Empty( pListenSocket )
NetIO_ServerStop( pListenSocket )
pListenSocket := NIL
GravaLog(cFileLog,HB_DTOC(Date(),"DD/MM/YYYY")+" "+Time()+": SERVIDOR NETIO PARADO"+IF(lSaida," (SAIDA)",""))
ENDIF
RETURN Nil
FUNCTION IniciarServidor
LOCAL nTentativa:=1
MEMVAR pListenSocket
IF Empty(pListenSocket)
PararServidor()
pListenSocket := NetIO_mtServer( Val(c_Port),c_Addr,,.T.,"senha")
DO WHILE Empty(pListenSocket)
IF nTentativa > 10
GravaLog(cFileLog,HB_DTOC(Date(),"DD/MM/YYYY")+" "+Time()+": ERRO NA INICIALIZACAO DO SERVIDOR NETIO")
MsgInfo( "Servidor não pode ser inicializado em "+c_Addr+":"+c_Port)
EndWindow()
ENDIF
c_Addr:=Verifica_Ip()
c_Port:=LTrim(Str(Val(c_Port)+1))
pListenSocket := NetIO_mtServer( Val(c_Port),c_Addr,,.T.,"senha")
nTentativa++
ENDDO
IF c_Addr <> Verifica_Ip()
AtualizaIni()
ENDIF
cServidorDB:='//'+c_Addr+':'+c_Port+'/'
GravaLog(cFileLog,HB_DTOC(Date(),"DD/MM/YYYY")+" "+Time()+": SERVIDOR NETIO REINICIADO")
//MsgInfo( "Servidor foi inicializado em "+c_Addr+":"+c_Port)
ENDIF
RETURN Nil
//FUNCTION Verifica(pSocket)
//MEMVAR pListenSocket
// DO WHILE !EMPTY( pSocket )
// ThreadSleep( 1000 )
// ENDDO
//RETURN .T.
FUNCTION VERIFICA_IP
LOCAL aHosts, cName, cEstacao:=NetName(.F.)
HB_InetInit()
aHosts := HB_InetGetHosts( cEstacao )
IF aHosts == NIL
aHosts := HB_InetGetAlias( cEstacao )
ENDIF
IF Empty(aHosts)
aHosts := HB_InetGetAlias( cEstacao )
ENDIF
HB_InetCleanup()
RETURN aHosts[1]
FUNCTION Obter_Ip_Maquina(cMaquina)
LOCAL aHosts:={}
HB_InetInit()
aHosts := HB_InetGetHosts( cMaquina )
IF aHosts == NIL
aHosts:=HB_InetGetAlias( cMaquina )
ENDIF
IF Empty(aHosts)
aHosts:=HB_InetGetAlias( cMaquina )
ENDIF
HB_InetCleanup()
RETURN IF(Len(aHosts)>0,aHosts[1],"")
FUNCTION AtualizaIni
hWrite["MAIN" ] := Hash()
hWrite["MAIN" ]["Desc" ] := "Servidor - NetIO - 2011"
hWrite["MAIN" ]["Ver" ] := "Versao 2.0"
hWrite["CONFIGURACAO" ] := Hash()
hWrite["CONFIGURACAO" ]["Port"] := c_Port
hWrite["CONFIGURACAO" ]["Path"] := c_Path
hWrite["CONFIGURACAO" ]["Addres"] := c_Addr
hWrite["CONFIGURACAO" ]["Servidor"] := c_SRVN
HB_WriteIni( cFileIni, hWrite,"--- Inicio ---", "--- Fim ---" )
RETURN Nil
FUNCTION EXISTE(cIndice)
LOCAL lExiste
lExiste:=File("DB"+HB_OSPathSeparator()+cIndice)
RETURN lExiste
FUNCTION APAGAINDICE(cIndice)
LOCAL lOk:=.T.
FileDelete("DB"+HB_OSPathSeparator()+cIndice)
RETURN lOk
FUNCTION LIMPARTEMP(cArq,nDias)
LOCAL cFile, lOk:=.T.
DEFAULT nDias TO 10
cFile := FileSeek("DB"+HB_OSPathSeparator()+cArq)
DO WHILE !Empty(cFile)
IF FileDate() <= Date() - nDias
IF File("DB"+HB_OSPathSeparator()+cFile)
FileDelete("DB"+HB_OSPathSeparator()+cFile)
ENDIF
ENDIF
cFile:=FileSeek()
ENDDO
RETURN lOk
FUNCTION SYS( cExtensao, Ini )
LOCAL cDbfDbf,;
cData,;
TmpHandle
DEFAULT Ini TO "XT",;
cExtensao TO ""
cData := StrZero(HB_Random(999999),6)
cDbfDbf := "DB"+HB_OSPathSeparator()+Ini+cData+cExtensao
DO WHILE .T.
cFile := FileSeek(cDbfDbf)
lExiste:=.F.
DO WHILE !Empty(cFile)
cData := StrZero(HB_Random(999999),6)
cDbfDbf:= "DB"+HB_OSPathSeparator()+Ini+cData+cExtensao
lExiste:=.T.
cFile := FileSeek()
ENDDO
IF !lExiste
TmpHandle := FCreate(cDbfDbf)
IF TmpHandle # - 1
IF FClose(TmpHandle)
EXIT
ENDIF
ENDIF
ENDIF
ENDDO
RETURN (cDbfDbf)
FUNCTION SYS2( cExtensao, Ini )
LOCAL cDbfDbf,;
cData,;
TmpHandle
DEFAULT Ini TO "XT",;
cExtensao TO ""
cData := StrZero(HB_Random(999999),6)
cDbfDbf := "DB"+HB_OSPathSeparator()+Ini+cData+cExtensao
DO WHILE .T.
cFile := FileSeek(cDbfDbf)
lExiste:=.F.
DO WHILE !Empty(cFile)
cData := StrZero(HB_Random(999999),6)
cDbfDbf:= "DB"+HB_OSPathSeparator()+Ini+cData+cExtensao
lExiste:=.T.
cFile := FileSeek()
ENDDO
IF !lExiste
TmpHandle := FCreate(cDbfDbf)
IF TmpHandle # - 1
IF FClose(TmpHandle)
EXIT
ENDIF
ENDIF
ENDIF
ENDDO
RETURN (Ini+cData)
FUNCTION SYSTXT( cExtensao )
LOCAL cTxtTxt,;
cData,;
nTmpHandle
cData := StrZero(HB_Random(999999),6)
cTxtTxt:= "DB"+HB_OSPathSeparator()+"TX"+cData+cExtensao
DO WHILE .T.
cFile := FileSeek(cTxtTxt)
lExiste:=.F.
DO WHILE !Empty(cFile)
cData :=StrZero(HB_Random(999999),6)
cTxtTxt:="DB"+HB_OSPathSeparator()+"TX"+cData+cExtensao
lExiste:=.T.
cFile :=FileSeek()
ENDDO
IF !lExiste
nTmpHandle := FCreate(cTxtTxt)
IF nTmpHandle # - 1
IF FClose(nTmpHandle)
EXIT
ENDIF
ENDIF
ENDIF
ENDDO
RETURN (cTxtTxt)
FUNCTION CRIAETIQUETA(cDataBase)
LOCAL lOk:=.T., aStru:={}
IF !File("DB"+HB_OSPathSeparator()+cDataBase)
AADD(aStru,{"C1","C",57,0})
AADD(aStru,{"C2","C",57,0})
AADD(aStru,{"C3","C",57,0})
DbCreate("DB"+HB_OSPathSeparator()+cDataBase,aStru)
lOk:=File("DB"+HB_OSPathSeparator()+cDataBase)
ENDIF
RETURN lOk
FUNCTION CRIATEMP(aStruTemp)
LOCAL cArqTemp:=STRTRAN(SYS2(".DBF"),".DBF")
DbCreate("DB"+HB_OSPathSeparator()+cArqTemp,aStruTemp,"DBFCDX")
RETURN cArqTemp
INIT FUNCTION Config
REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_PT850
HB_LANGSELECT("PT")
HB_CDPSELECT( "PT850" )
SET DATE BRITI
SET CENTURY ON
SET OPTIMIZE ON
REQUEST HB_DATETIME
REQUEST DBFCDX
RddSetDefault("DBFCDX")
RETURN Nil
/*#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"
#define WINVER 0x0500
#define WM_TASKBAR WM_USER + 1043
#define WM_NOTIFYICON WM_USER+1000
#define ID_NOTIFYICON 1
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;
nid.uCallbackMessage = WM_TASKBAR;
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_MODIFY, &nid );
if(hIcon)
DestroyIcon( hIcon );
}
#pragma ENDDUMP */
#pragma BEGINDUMP
#define _WIN32_IE 0x0500
#define HB_OS_WIN_32_USED
#define _WIN32_WINNT 0x0400
#include "hbapi.h"
#include <windows.h>
#include <commctrl.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 _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"
#include "hbapiitm.h"
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( 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 );
}
static HWND GetStartButton(void);
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_MODIFY, &nid );
if(hIcon)
DestroyIcon( hIcon );
}
HB_FUNC ( SETSTARTBUTTONIMAGE )
{
HWND hButton = GetStartButton();
HDC hDCButton = GetDC(hButton);
HDC hDcCompatibleButton;
RECT rc;
int nWidth, nHeight;
HBITMAP hBitmap, hBitmapOld;
BITMAP bitmap;
GetWindowRect(hButton, &rc);
nWidth = rc.right - rc.left;
nHeight = rc.bottom - rc.top;
hDcCompatibleButton = CreateCompatibleDC(hDCButton);
hBitmap = (HBITMAP)LoadImage (NULL, hb_parc(1), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
hBitmapOld = (HBITMAP)SelectObject(hDcCompatibleButton, hBitmap);
GetObject(hBitmap, sizeof(BITMAP), &bitmap);
if (nWidth > bitmap.bmWidth - 3 && nWidth < bitmap.bmWidth + 3 && nHeight > bitmap.bmHeight - 3 && nHeight < bitmap.bmHeight + 3)
BitBlt(hDCButton, 0, 0, nWidth, nHeight, hDcCompatibleButton, 0, 0, SRCCOPY);
else
StretchBlt(hDCButton, 0, 0, nWidth, nHeight, hDcCompatibleButton, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);
SelectObject(hDcCompatibleButton, hBitmapOld);
DeleteDC(hDcCompatibleButton);
DeleteDC(hDCButton);
DeleteObject(hBitmap);
}
static HWND GetStartButton()
{
static HWND hKnownButton=0;
HWND hTaskBar, hButton;
hTaskBar = FindWindow( "Shell_TrayWnd", NULL );
hButton = GetWindow( hTaskBar, GW_CHILD );
if (hButton)
hKnownButton = hButton;
else
hButton = hKnownButton;
return hButton;
}
HB_FUNC( GETKEYBOARDMODE )
{
HKL kbl;
HWND CurApp;
DWORD idthd;
int newmode;
CurApp=GetForegroundWindow();
idthd=GetWindowThreadProcessId(CurApp,NULL);
kbl=GetKeyboardLayout(idthd);
newmode=(int)LOWORD(kbl);
hb_retnl(newmode);
}
#pragma ENDDUMP */