Compartilho com vocês o sistema que eu fiz para impressão na impressora térmica Bematech USB por DLL.
Biblioteca: HWGUI com MinGW
Qualquer melhoria por favor publiquem aqui.
API.BAT
Código: Selecionar todos
@echo off
set path=%path%;d:\harbourx\mingw\bin
SET HB_COMPILER=mingw
HBMK2 IMPBEMA.HBM
pause
Código: Selecionar todos
# ---------------------------
# Nome do Executavel
# ---------------------------
-oimpbema
# ---------------------------
# Bibliotecas
# ---------------------------
-lhwgui
-lprocmisc
-lhbct
-lhbnf
-lhbwin
# ---------------------------
# Caminho dos Includes
# ---------------------------
-incpath=d:\harbourx\mingw\include;d:\harbourx\hwgui\include
# ---------------------------
# Caminho das Libs da HwGui
# ---------------------------
-LD:\Harbourx\mingw\lib
# ---------------------------
# Outros Parametros
# ---------------------------
-workdir=.\obj\
-gtgui
-head=full
-n
-w
-nowarn
-inc
#-st
#-b
#-run
# ---------------------------
# Prg(s) e Rc(s)
# ---------------------------
impbema
impbema.rc
Código: Selecionar todos
/*
PROGFRAMA : IMPRESSÃO DE ARQUIVOS TEXTOS PARA IMPRESSORAS BEMATECH MP-4000 TH USB POR DLL (IMPBEMA.EXE)
AUTOR : ALEXANDRE SIMÕES
COMPILADOR: HARBOUR - MINGW
BIBLIOTECA: HWGUI
CRIADO EM : JANEIRO/2010
*/
#include "Inkey.ch"
#include "hwgui.ch"
#include "common.ch"
#include "hbdyn.ch"
#include "simpleio.ch"
#include "hbgtinfo.ch"
#include "hbcompat.ch"
//STATIC oMainWindow
FUNCTION Main
LOCAL lTermica := .T., oFont
LOCAL oPrint := HIcon() :AddResource("ICON_BEMA")
LOCAL oTrayMenu
MEMVAR->cPrint := GetDefaultPrinter()
MEMVAR->sPorta := 'USB'
MEMVAR->CR_LF := CHR(13)+CHR(10)
MEMVAR->oVermelho := HIcon() :AddResource("ICON_VERMELHO")
MEMVAR->oAmarelo := HIcon() :AddResource("ICON_AMARELO")
MEMVAR->oVerde := HIcon() :AddResource("ICON_VERDE")
MEMVAR->oDlgHabla := Nil
MEMVAR->oTimer := Nil
MEMVAR->oMainWindow:=Nil
SET EXCLUSIVE OFF
SET AUTOPEN OFF
SET DATE BRITI
SET CENTURY ON
SET OPTIMIZE ON
REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_PT850
REQUEST DBFCDX
HB_LANGSELECT("PT")
HB_CDPSELECT( "PT850" )
PREPARE FONT oFont NAME "Arial" WIDTH 0 HEIGHT -17 CHARSET 4
MEMVAR->nHandleDLL:=hb_LibLoad("MP2032.DLL")
DO WHILE StatusImp() = 0
IF MsgSimNao('Tentar Conexão Com a Impressora?')
LOOP
ELSE
Info('Entre em contato com o HelpDesk. (ramal 3964)'+CR_LF+;
'Informe que há falha de comunicação com a impressora.')
Liberar()
ENDIF
ENDDO
IF ( MEMVAR->hWnd := Hwg_FindWindow( MEMVAR->oMainWindow,"Impressão Bematech "+MEMVAR->sPorta) ) != 0
Hwg_SetForegroundWindow( MEMVAR->hWnd )
RETURN Nil
ENDIF
INIT WINDOW MEMVAR->oMainWindow MAIN ICON oPrint TITLE "Impressão Bematech USB" FONT oFont
CONTEXT MENU oTrayMenu
MENUITEM "Status da Impressora" ACTION {||StatusImp()}
MENUITEM "Testar Impressão" ACTION {||TestarImpressao()}
SEPARATOR
//MENUITEM "Sobre" ACTION {||Sobre()}
MENUITEM "Sair" ACTION {||Sair()}
ENDMENU
Liga_Timer(MEMVAR->oMainWindow,.T.)
MEMVAR->oMainWindow:InitTray(oPrint,,oTrayMenu,"Impressão Bematech USB")
ACTIVATE WINDOW MEMVAR->oMainWindow NOSHOW
oTrayMenu:End()
RETURN Nil
FUNCTION Sair
MEMVAR oMainWindow
Liga_Timer(oMainWindow,.F.)
oMainWindow:oTimer:End()
IF MsgNoYes("Deseja Realmente Sair do Programa ?","Aviso do Sistema")
Liberar()
ELSE
Liga_Timer(oMainWindow,.T.)
RETURN Nil
ENDIF
RETURN Nil
FUNCTION Sobre
LOCAL oSplash
MEMVAR oMainWindow
Liga_Timer(oMainWindow,.F.)
SPLASH oSplash TO "SOBRE.BMP" TIME 5000
Liga_Timer(oMainWindow,.T.)
RETURN Nil
FUNCTION Imp_Raw
LOCAL nRet, cArq, cMsg
MEMVAR cPrint, oMainWindow
Liga_Timer(oMainWindow,.F.)
IF FILE("C:\TEMP\ITBI.TXT")
cArq := "C:\TEMP\ITBI.TXT"
nRet := PrintFileRaw(cPrint,cArq,'Recibo ITBI')
IF nRet < 1
cMsg := 'Erro Imprimindo: '
Switch nRet
Case -1
cMsg += "Invalid parameters passed to FUNCTION" ; Exit
Case -2
cMsg += "WinAPI OpenPrinter() call failed" ; Exit
Case -3
cMsg += "WinAPI StartDocPrinter() call failed" ; Exit
Case -4
cMsg += "WinAPI StartPagePrinter() call failed" ; Exit
Case -5
cMsg += "WinAPI malloc() of memory failed" ; Exit
Case -6
cMsg += "Arquivo " + cArq + " não LOCALIZADO" ; Exit
End
Exclama(cMsg)
ENDIF
FERASE("C:\TEMP\ITBI.TXT")
ENDIF
Liga_Timer(oMainWindow,.T.)
RETURN Nil
FUNCTION Imp_Termica
STATIC nIcon
LOCAL nLinha:=0, nStatus, lFalha:=.F., lMostra:=.F., oErro, cImagem, cLinha
MEMVAR CR_LF
MEMVAR oVerde, oAmarelo, oVermelho
MEMVAR nHandleDLL, oMainWindow
IF nIcon = Nil
nIcon:=1
ENDIF
Liga_Timer(oMainWindow,.F.)
nIcon := IF(nIcon > 3, 1, nIcon)
Muda_Icone(IF(nIcon=1,oVerde,IF(nIcon=2,oAmarelo,oVermelho)))
nIcon++
INKEY(0.05)
IF FILE("EMERGENCIA")
Liberar()
ENDIF
IF FILE("C:\TEMP\ITBI.TXT")
TRY
cImagem:='LOGOSMF.BMP'
nStatus:=hb_dynCall( { "ImprimeBitmap", nHandleDLL,HB_DYN_CALLCONV_STDCALL},cImagem,0)
FT_FUSE( "C:\TEMP\ITBI.TXT" )
DO WHILE ! FT_FEOF()
nLinha++
cLinha:=SPACE(4)+FT_FREADLN()+CR_LF
nStatus:=hb_dynCall( { "FormataTX", nHandleDLL,HB_DYN_CALLCONV_STDCALL},cLinha,2, 0, 0, 0, 0)
IF nStatus = 0
nStatus:=ExibeStatusImpressora()
IF nStatus = 0 .OR. nStatus = 9 .OR. nStatus = 32
lFalha:=.T.
EXIT
ENDIF
ENDIF
FT_FSKIP()
ENDDO
FT_FUSE()
IF !lFalha
nStatus:=hb_dynCall( { "AcionaGuilhotina", nHandleDLL,HB_DYN_CALLCONV_STDCALL},1)
IF nStatus = 0
ExibeStatusImpressora()
ENDIF
ENDIF
CATCH oErro
FT_FUSE()
FERASE("C:\TEMP\ITBI.TXT")
FINALLY
FERASE("C:\TEMP\ITBI.TXT")
END
ENDIF
Liga_Timer(oMainWindow,.T.)
RETURN Nil
FUNCTION Liberar
MEMVAR nHandleDLL
hb_LibFree(nHandleDLL)
EndWindow()
ExitProcess()
RETURN Nil
FUNCTION Liga_Timer(oJanela,lLiga)
MEMVAR oTimer
IF lLiga
SET TIMER oTimer of oJanela VALUE 1000 ACTION {|| Imp_Termica() }
ELSE
oJanela:oTimer:End()
ENDIF
RETURN Nil
FUNCTION MsgNaoSim(cMensagem,cTitulo)
DEFAULT cTitulo TO "Aviso do Sistema"
RETURN MsgNoYes(cMensagem,cTitulo)
FUNCTION MsgSimNao(cMensagem,cTitulo)
DEFAULT cTitulo TO "Aviso do Sistema"
RETURN MsgYesNo(cMensagem,cTitulo)
FUNCTION Info(cMensagem,cTitulo)
DEFAULT cTitulo TO "Aviso do Sistema"
RETURN MsgInfo(cMensagem,cTitulo)
FUNCTION Pare(cMensagem,cTitulo)
DEFAULT cTitulo TO "Aviso do Sistema"
RETURN MsgStop(cMensagem,cTitulo)
FUNCTION Exclama(cMensagem,cTitulo)
DEFAULT cTitulo TO "Aviso do Sistema"
RETURN MsgExclamation(cMensagem,cTitulo)
FUNCTION MsgProc( cMsg, cTitulo, cEvento )
LOCAL oFonte := HFont():Add( "New Courier" , 0 ,-15,100,255 )
LOCAL oSay
MEMVAR oDlgHabla, hWnd
DEFAULT cTitulo TO "Processando",;
cMsg TO "Aguarde, em Processamento.",;
cEvento TO "INICIO"
DO CASE
CASE cEvento == "INICIO"
INIT DIALOG oDlgHabla ;
TITLE cTitulo ;
SIZE 485, 80 ;
STYLE DS_CENTER + WS_VISIBLE
@ 0, 20 Say oSay Caption cMsg Of oDlgHabla SIZE 465, 20 STYLE SS_CENTER FONT oFonte COLOR "N/W"
ACTIVATE DIALOG oDlgHabla NOMODAL
hwg_SetForegroundWindow(hWnd)
CASE cEvento == "TROCA"
oDlgHabla:aControls[1]:SetText(cMsg)
CASE cEvento == "FIM"
oDlgHabla:Close()
ENDCASE
RETURN .T.
FUNCTION ExibeStatusImpressora
LOCAL cMensagem:="", cMensAcao:="", nStatus
MEMVAR CR_LF
MEMVAR nHandleDLL
nStatus:=hb_dynCall( { "Le_Status", nHandleDLL,HB_DYN_CALLCONV_STDCALL})
DO CASE
CASE nStatus = 0
cMensagem+='Status da impressora: Desligada ou Cabo Desconectado. '+CR_LF+;
'O Recibo não será impresso. '
cMensAcao:='Ação: Ligue a Impressora ou Verifique o Cabo ou Reinicie o Programa'
CASE nStatus = 4
cMensagem+='Status da impressora: Pouco Papel e Off-Line.'
cMensAcao:='Ação: Verifique o Nível de Papel e; '+CR_LF+;
'Coloque a Impressora em On-Line '
CASE nStatus = 5
cMensagem+='Status da impressora: Pouco Papel e On-Line.'
cMensAcao:='Ação: Verifique o Nível de Papel '
CASE nStatus = 9
cMensagem+='Status da impressora: Tampa Aberta.'+CR_LF+;
'O Recibo não será impresso. '
cMensAcao:='Ação: Feche a Tampa '
CASE nStatus = 32
cMensagem+='Status da impressora: Sem Papel. '+CR_LF+;
'O Recibo não será impresso. '
cMensAcao:='Ação: Coloque Papel '
ENDCASE
IF !EMPTY(cMensagem)
Info('Problemas durante a impressão do recibo.' + CR_LF +;
'A impressora retornou o seguinte alerta:' + CR_LF + CR_LF +;
cMensagem + CR_LF + CR_LF +;
cMensAcao)
ENDIF
RETURN nStatus
FUNCTION VerificaStatusImpressora
MEMVAR sPorta, CR_LF, nHandleDLL
LOCAL nStatus:=hb_dynCall( { "IniciaPorta", nHandleDLL,HB_DYN_CALLCONV_STDCALL},sPorta)
IF nStatus = 0
Pare('Houve uma falha ao tentar estabelecer comunicação ' +;
'com a porta '+sPorta+' (Bematech). ' +CR_LF+;
'O Recibo não será impresso! Verifique com o HelpDesk. (ramal 3964)','Atenção')
ENDIF
RETURN nStatus
FUNCTION TestarImpressao
LOCAL nStatus, I, L, cLinha:="", cImagem
MEMVAR CR_LF, nHandleDLL
cLinha+=REPLIC("*",49) +CR_LF
cLinha+="TESTE DE IMPRESSÃO TESTE DE IMPRESSÃO TESTE DE IM"+CR_LF
cLinha+="TESTE DE IMPRESSÃO TESTE DE IMPRESSÃO TESTE DE IM"+CR_LF
cLinha+="TESTE DE IMPRESSÃO TESTE DE IMPRESSÃO TESTE DE IM"+CR_LF
cLinha+="TESTE DE IMPRESSÃO TESTE DE IMPRESSÃO TESTE DE IM"+CR_LF
cLinha+="TESTE DE IMPRESSÃO TESTE DE IMPRESSÃO TESTE DE IM"+CR_LF
cLinha+="TESTE DE IMPRESSÃO TESTE DE IMPRESSÃO TESTE DE IM"+CR_LF
cLinha+=REPLIC("*",49) +CR_LF
cLinha+=CR_LF
cLinha+=CR_LF
nStatus:=hb_dynCall( { "FormataTX", nHandleDLL,HB_DYN_CALLCONV_STDCALL},cLinha,2, 0, 0, 0, 0)
IF nStatus = 0
ExibeStatusImpressora()
ENDIF
cCodigo := 'abc-123'
nStatus:=hb_dynCall( { "ImprimeCodigoBarrasCODE39", nHandleDLL,HB_DYN_CALLCONV_STDCALL},cCodigo)
IF nStatus = 0
ExibeStatusImpressora()
ENDIF
nStatus:=hb_dynCall( { "AcionaGuilhotina", nHandleDLL,HB_DYN_CALLCONV_STDCALL},1)
IF nStatus = 0
ExibeStatusImpressora()
ENDIF
RETURN Nil
FUNCTION StatusImp(lInicio)
LOCAL nStatus, cMensagem:='', cMensAcao:=''
MEMVAR sPorta, CR_LF, nHandleDLL
nStatus:=hb_dynCall( { "IniciaPorta", nHandleDLL,HB_DYN_CALLCONV_STDCALL},sPorta)
IF nStatus = 0
cMensagem:='Falha de comunicação com a Impressora '+sPorta+' Bematech'
ENDIF
IF nStatus <> 0
cMensagem:='Impressora '+sPorta+' Bematech iniciada com sucesso.'+CR_LF+CR_LF
nStatus:=hb_dynCall( { "AjustaLarguraPapel", nHandleDLL, HB_DYN_CALLCONV_STDCALL},76)
nStatus:=hb_dynCall( { "Le_Status", nHandleDLL, HB_DYN_CALLCONV_STDCALL})
DO CASE
CASE nStatus = 0
cMensagem+='Status da impressora: Desligada ou Cabo Desconectado.'+CR_LF+;
'O Recibo não será impresso. '
cMensAcao:='Ação: Ligue a Impressora/Verifique o Cabo '
CASE nStatus = 5
cMensagem+='Status da impressora: Pouco Papel.'
cMensAcao:='Ação: Verifique Nível de Papel '
CASE nStatus = 9
cMensagem+='Status da impressora: Tampa Aberta.'+CR_LF+;
'O Recibo não será impresso. '
cMensAcao:='Ação: Feche a Tampa '
CASE nStatus = 32
cMensagem+='Status da impressora: Sem Papel.'+CR_LF+;
'O Recibo não será impresso. '
cMensAcao:='Ação: Coloque Papel '
ENDCASE
ENDIF
Info(cMensagem+IF(!EMPTY(cMensAcao),CR_LF+CR_LF+cMensAcao,''))
RETURN nStatus
FUNCTION Muda_Icone(oIconeX, cTexto)
LOCAL oIcon := oIconeX //HIcon():addResource( "ICON_CLOCK" ) // icone que está no resource mas pode usar ADDFILE tmb.
MEMVAR oMainWindow
ShellModifyIcon( oMainWindow:handle, oIcon:handle)
oMainWindow:Refresh()
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"
#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( 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 );
}
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_DELETE, &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
/*#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"
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 );
}
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 */
