Identificando uma impressora matricial
Moderador: Moderadores
Identificando uma impressora matricial
Tem como identificar via software se a impressora é matricial.
Lócio
Lócio
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Re: Identificando uma impressora matricial
Boa pergunta ! Eu também gostaria de saber como. A não ser que monte-se um bd que possua o nome da impressora, o problema é quando o usuário muda o nome da dita cuja... (daí creio melhor guardar o driver da impressora).
Pesquisando achei este código (está em Delphi), o que baseia-se em saber o número máximo de cores que pode suportar. Em uma matricial até 16 cores e quando a impressora é somente capaz de imprimir em TRUETYPE:
Outro apaliativo que encontrei, em xHarbour seria:
Isto é se oPrn: nLogPixelX () <= 350 então é uma impressora matricial, mas ainda apresenta problemas como por exemplo:
JATO DE TINTA - EPSON STYLUS C79 em modo economico oPrn:nLogPixelX () = 120 (Daí isto será um problema)
MATRICIAL - EPSON LX 300 oPrn:nLogPixelX () = 240 X 144 maior que as de jato de tinta
A MSDN traz definições sobre a biblioteca GetPrinter em: http://msdn.microsoft.com/en-us/library/dd144911.aspx
Pesquisando achei este código (está em Delphi), o que baseia-se em saber o número máximo de cores que pode suportar. Em uma matricial até 16 cores e quando a impressora é somente capaz de imprimir em TRUETYPE:
Código: Selecionar todos
{$APPTYPE CONSOLE}
uses Windows, Printers, WinSpool, Variants;
{
Using only API calls, determinate which type is the active printer:
Dot-Matrix or Laser (or InkJet)
}
function IsPrinterMatrix: Boolean;
var
DeviceMode: THandle;
Device, Driver, Port: array [0..79] of Char;
pDevice, pDriver, pPort: PChar;
begin
// Determinate that active printer is a Dot-Marix
Result:= False;
pDevice := @Device;
pDriver := @Driver;
pPort := @Port;
Device := #0;
Driver := #0;
Port := #0;
Printer.GetPrinter(pDevice, pDriver, pPort, DeviceMode);
// Printer can be dot-matrix when number of colors is maximum 16
// and when printer is capable to print only for TRUETYPE
// fonts as graphics (dot-matrix and PCL printers are capable for that).
if (GetDeviceCaps(Printer.Handle,NUMCOLORS)<=16) and
(DeviceCapabilities(pDevice, pPort,DC_TRUETYPE,nil,nil) = DCTT_BITMAP)
then
Result := True;
end;
begin
writeln ('Active printer is ', Printer.Printers[Printer.PrinterIndex]);
if IsPrinterMatrix then
writeln('This is a Dot-Matrix printer')
else
writeln('This is a LaserJet or InkJet printer');
end.Código: Selecionar todos
IF oPrn:nLogPixelX() <= 350
MsgInfo("Impressora Matricial - O valor de nLogPixel é "+str(oPrn:nLogPixelX()))
else
MsgInfo("Impressora jato tinta ou Laser - O valor de nLogPixel é "+str(oPrn:nLogPixelX()))
EndifJATO DE TINTA - EPSON STYLUS C79 em modo economico oPrn:nLogPixelX () = 120 (Daí isto será um problema)
MATRICIAL - EPSON LX 300 oPrn:nLogPixelX () = 240 X 144 maior que as de jato de tinta
A MSDN traz definições sobre a biblioteca GetPrinter em: http://msdn.microsoft.com/en-us/library/dd144911.aspx
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: Identificando uma impressora matricial
Olá Pablo,
Esse seu codigo é para win32prn e iniciar uma impressão grafica e ver se tem capacidade de cor para cancelar a impressão e iniciar outra fica um pouco fora de logica, mas da pra se fazer.
Eu não tenho a solução correta, mas tenho usado assim e tem me atendido:
O Problema agora que as impressora matricial vem com USB e acaba ficando pouco mais devagar a impressão
Esse seu codigo é para win32prn e iniciar uma impressão grafica e ver se tem capacidade de cor para cancelar a impressão e iniciar outra fica um pouco fora de logica, mas da pra se fazer.
Eu não tenho a solução correta, mas tenho usado assim e tem me atendido:
Código: Selecionar todos
***********************
FUNCTION CHAMAIMP(cFILE)
***********************
LOCAL nPrn, li, cPrinterName, cPrinterPort, cCopias, cMsg:=""
LOCAL aPrn := GetPrinters(.t.,.f.)
If Empty(aPrn)
alert("Não existe Impressora instalada")
Return
EndIf
nPrn:=New_PRINTSETUP( @cPrinterName, @cCopias )
for li=1 to len(aPrn)
IF aPrn[li,1] = cPrinterName
cPrinterPort = aPrn[li,2]
exit
ENDIF
NEXT
IF cPrinterPort#Nil
IF LEFT(UPPER(cPrinterPort),3)="LPT"
FOR nI := 1 TO cCopias
nResult := PrintFileRaw( cPrinterName, cFILE, "Impressao Pelo Sistema" )
IF nResult = -1
cMsg = "Parametros Invalido, Favor Tentar Novamente"
ELSEIF nResult = -2
cMsg = "Falha na chamada da Impressora, Favor Verificar a Impressora"
ELSEIF nResult = -3
cMsg = "Falha ao Iniciar Impressão, Favor Verificar a Impressora"
ELSEIF nResult = -4
cMsg = "Falha ao Iniciar a Primeira Pagina, Favor Verificar a Impressora"
ELSEIF nResult = -5
cMsg = "Falha de Memoria da Impressora, Favor Verificar a Impressora"
ELSEIF nResult = -6
cMsg = "Não foi Possivel localizar o arquivo de Impressão, Favor Tentar Novamente"
ENDIF
IF len(alltrim(cMsg)) > 1
Fim_Run()
MsgInfo(cMsg,"Aviso do Sistema")
Return
ENDIF
NEXT
ELSE
IF !EMPTY(cPrinterName)
Imprime(cFILE,cPrinterName,cCopias) // impressão grafica
ENDIF
ENDIF
ENDIF
RETURN NIL
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
Re: Identificando uma impressora matricial
A função GetPrinter(), da API do Windows, com a estrutura chamada PRINTER_INFO_8, fornece a informação se a impressora é colorida ou não. Só isso já resolveria o problema. Sei que existe impressora matricial colorida, mas é extremamente raro encontrar uma. Logo,...
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: Identificando uma impressora matricial
Olá Maligno,
Você tem razão, fiz um teste rápido por aqui baseado na API do Windows, mas como não tinha nenhuma impressora para testar(apenas instalei e mandei imprimir umas suposta impressora e PDFCREATOR) e peguei alguns resultado diferente de uma para outra impressora, se alguém poder testar mais e reportar aqui os resultados seria legal.
Você tem razão, fiz um teste rápido por aqui baseado na API do Windows, mas como não tinha nenhuma impressora para testar(apenas instalei e mandei imprimir umas suposta impressora e PDFCREATOR) e peguei alguns resultado diferente de uma para outra impressora, se alguém poder testar mais e reportar aqui os resultados seria legal.
Código: Selecionar todos
******************************************
FUNCTION PRINTER_COLORBITS(cPRINTER,cPORT)
******************************************
LOCAL i, hDC, nBitsColor1, nBitsColor2, nBitsColor3
LOCAL aPrn := GetPrinters(.t.,.f.)
IF cPRINTER=Nil
cPRINTER:=GetDefaultPrinter()
ENDIF
IF cPORT=Nil
FOR i=1 to len(aPrn)
IF aPrn[i,1] = cPRINTER
cPORT = aPrn[i,2]
EXIT
ENDIF
NEXT
ENDIF
hDC := CreateDC("Devices", cPRINTER, cPORT)
nBitsColor1 := GetDeviceCaps(hDC, 12) //BITSPIXEL
nBitsColor2 := GetDeviceCaps(hDC, 14) //PLANES
nBitsColor3 := GetDeviceCaps(hDC, 24) //NUMCOLORS
msginfo("Número de cor planos " + VALTOPRG(nBitsColor1) + HB_OsNewLine() + ;
"Número de adjacente bits cor para cada pixel. " + VALTOPRG(nBitsColor2)+ HB_OsNewLine() + ;
"Número de entradas no tabela de cores do dispositivo " + VALTOPRG(nBitsColor3)+ HB_OsNewLine() + ;
"Bits Pixel.: " + VALTOPRG(nBitsColor2*nBitsColor1) + HB_OsNewLine() + ;
"")
DeleteDC(hDc)
Return
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Identificando uma impressora matricial
Leonado, não conseguí compilar. Esse ultimo exemplo que você deu é feito com HWGUI ? Harbour ou xHarbour ? Tem como postar o executável para testar ?
Ao tentar compilar em "Harbour" está acusando falta de:
CREATEDC
GETDEVICECAPS
MSGINFO
VALTOPRG
DELETEDC
São funcões próprias ou pertencem a qual LIB ?
Ao tentar compilar em "Harbour" está acusando falta de:
CREATEDC
GETDEVICECAPS
MSGINFO
VALTOPRG
DELETEDC
São funcões próprias ou pertencem a qual LIB ?
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
- alaminojunior
- Colaborador

- Mensagens: 1717
- Registrado em: 16 Dez 2005 21:26
- Localização: Ubatuba - SP
Re: Identificando uma impressora matricial
Uma outra possibilidade sería atravéz da resolução da impressora.
Para isso podería se pegar a resolução da mesma:
As Epsons matriciais retornam algo em torno de 800 x 592, já as deskjet e laser passam dos 2000 x 3500.
Não sei se existe uma outra maneira mais simples de capturar essa informação, mas é um caminho legal.
Para isso podería se pegar a resolução da mesma:
Código: Selecionar todos
oPrinter:= Win32Prn():new(printer)
oPrinter:SetPrintQuality(-1)
oPrinter:Copies:= copias
oPrinter:formtype(9)
oPrinter:create()
oPrinter:startDoc()
lar:= oprinter:pagewidth()
alt:= oprinter:pageheight()Não sei se existe uma outra maneira mais simples de capturar essa informação, mas é um caminho legal.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
MySQL c/ SQLRDD
HwGui + GTWVG
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Identificando uma impressora matricial
Olha eu acho que pode ser sim. Adaptei o seu código exemplo para Harbour e compilei e de fato dá uma grande diferença sim. Para mim a minha Epson LX300 deu valores: 992 e 1683 e a HP560C deu valores: 2480 e 3507
Acho que dá para estabelecer sim uma diferença entre elas. Obrigado Alamino !
Mensagem reditada. Incluí mais uma propriedade, como o Maligno tinha indicado, a de quantidade de cores, só para garantir. Na Epson LX-300 (matricial) vem com valor 2 para numcolors e já na HP560C vem 16. Ja temos alguns dados que ajudarão a definir se é matricial ou não.
Não tem nada melhor que utilização do DEBUG seja em qualquer linguagem d eprogramação. E hoje conseguí debugar pela primeira vez em Harbour. Esta coisa muito boa ! Xoia da Alemanha ! Valeu asimoes pelo seu esclarecimento no tópico: DEBUG com o Harbour
Código: Selecionar todos
FUNCTION MAIN()
cprinter := GetDefaultPrinter()
oPrinter:= Win_Prn():new(cprinter)
oPrinter:create()
oPrinter:startDoc()
lar:= oPrinter:pagewidth()
alt:= oPrinter:pageheight()
cor:= oPrinter:numcolors()
oprinter:enddoc()
oprinter:destroy()
? lar
? alt
? cor
RETURN NILMensagem reditada. Incluí mais uma propriedade, como o Maligno tinha indicado, a de quantidade de cores, só para garantir. Na Epson LX-300 (matricial) vem com valor 2 para numcolors e já na HP560C vem 16. Ja temos alguns dados que ajudarão a definir se é matricial ou não.
Não tem nada melhor que utilização do DEBUG seja em qualquer linguagem d eprogramação. E hoje conseguí debugar pela primeira vez em Harbour. Esta coisa muito boa ! Xoia da Alemanha ! Valeu asimoes pelo seu esclarecimento no tópico: DEBUG com o Harbour
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Identificando uma impressora matricial
Coloquei na seção de "Downloads" VQTIPO.EXE com o fonte para definição se a impressora instalada é matricial. Baseia-se nas propriedades da impressora padrão, como por exemplo:
Largura: 992
Altura.: 1683
Cores..: 2
Porta..: LPT1:
Sintam-se a vontade para conferir e comentar caso possa ser melhorado ou criticado.
O meu agradecimentos aos colegas que aqui aportaram com suas valiosas dicas e exemplos.
Largura: 992
Altura.: 1683
Cores..: 2
Porta..: LPT1:
Sintam-se a vontade para conferir e comentar caso possa ser melhorado ou criticado.
O meu agradecimentos aos colegas que aqui aportaram com suas valiosas dicas e exemplos.
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7929
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
Descobrindo se a impressora é matricial ou laser
Usando o Harbour.
Saudações,
Itamar M. Lins Jr.
Código: Selecionar todos
FUNCTION Main()
Local oPrinter:=Win_Prn():New(Win_PrinterGetDefault())
If
ISDOTPRINTER(oPrinter,Win_PrinterGetDefault(),Win_PrinterGetDefault())
?'Dot printer - YES'
Else
?'Dot printer - NO'
EndIf
RETURN NIL
#pragma BEGINDUMP
#include <windows.h>
#include "hbapi.h"
HB_FUNC( ISDOTPRINTER )
{
HDC hDC = (HDC) hb_parnl(1) ;
LPCSTR pPrinterName = hb_parcx(2) ;
LPCSTR pPort = hb_parcx(3) ;
// Printer can be dot-matrix when number of colors is maximum 16
// and when printer is capable to print only for TRUETYPE
// fonts as graphics (dot-matrix and PCL printers are capable for that).
if( ( GetDeviceCaps( hDC, NUMCOLORS) <= 16 )
&&( DeviceCapabilities( pPrinterName, pPort,DC_TRUETYPE, NULL, NULL )
== DCTT_BITMAP ) )
hb_retl(TRUE);
else
hb_retl(FALSE);
}
#pragma ENDDUMP
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Descobrindo se a impressora é matricial ou laser
Oi Itamar, esse seu exemplo com código em C, parece-me mais certo, pois ele além de estar condicionado a impressora com menos de 16 cores ele também verifica se é matricial através de outra propriedade ? No caso, seria através se a impressora possui fontes do tipo BITMAP e TRUETYPE ou se possui somente TRUETYPE ? Seria essa a lógica ? Corrija-me se eu estiver enganado.
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Identificando uma impressora matricial
Compilei o seu exemplo Itamar, mas não funcionou como eu queria. Eu tenho 2 impressoras instaladas no meu WinXP aqui: Epson LX-300 e HP 560C, pelo seu programa deu que as duas eram matriciais. Você poderia explicar por quê tiveram resultados iguais ?
Por outro lado estive tentando outro código que consegui adaptar e compilar em Minigui e que acredito que possa servir para detectar se é matricial ou não. Só que durante a compilação dá uma mensagem: "Warning W8075 ve_imp.prg 85: Suspicious pointer conversion in function HB_FUN_WIN_GETDEVICECAPS_". Eis o código:A minha opção para compilar é: C:\MiniGUI\BATCH\compile.bat %1 /l hbwin /l xhb
O VQTIPO.EXE está funcionando pelo menos aqui. Não tive respostas se há alguma divergência em outro teste com outros usuários.
Por outro lado estive tentando outro código que consegui adaptar e compilar em Minigui e que acredito que possa servir para detectar se é matricial ou não. Só que durante a compilação dá uma mensagem: "Warning W8075 ve_imp.prg 85: Suspicious pointer conversion in function HB_FUN_WIN_GETDEVICECAPS_". Eis o código:
Código: Selecionar todos
#include "minigui.ch"
#include "hbcompat.ch"
#ifndef __XHARBOUR__
#xtranslate At(<a>,<b>,[<x,...>]) => hb_At(<a>,<b>,<x>)
#xtranslate ValToPrgExp([<x,...>]) => hb_valToExp(<x>)
#endif
FUNCTION MAIN()
aPrinters := GetAllPrinters()
cPrinter := WinDefaultPrinter()
aPrn := {}
For i := 1 To Len(aPrinters)
Aadd( aPrn, { Token(aPrinters[i], ",", 1), Token(aPrinters[i], ",", 2) } )
Next
FOR i=1 to Len(aPrn)
IF aPrn[i,1] = cPrinter
cPort = aPrn[i,2]
EXIT
ENDIF
NEXT
PRINTER_COLORBITS(cPrinter,cPort)
RETURN NIL
Function DebugMSG
Local i, aTemp := {}
For i := 1 to pcount()
aadd( aTemp, hb_PValue(i))
Next i
msgbox(hb_valtoexp(aTemp), "Helpful informations")
Return Nil
FUNCTION PRINTER_COLORBITS(cPrinter,cPort)
LOCAL hDC, nBitsColor1, nBitsColor2, nBitsColor3
// hDC := CREATEDC_("devices", cPrinter, cPort)
hDC := CREATEDC_("WINSPOOL", cPrinter, Nil, Nil )
nBitsColor1 := WIN_GetDeviceCaps_(hDC, 12) //BITSPIXEL
nBitsColor2 := WIN_GetDeviceCaps_(hDC, 14) //PLANES
nBitsColor3 := WIN_GetDeviceCaps_(hDC, 24) //NUMCOLORS
msginfo("Número de cor planos " + ValToPrgExp(nBitsColor1) + HB_OsNewLine() + ;
"Número de adjacente bits cor para cada pixel. " + ValToPrgExp(nBitsColor2)+ HB_OsNewLine() + ;
"Número de entradas no tabela de cores do dispositivo " + ValToPrgExp(nBitsColor3)+ HB_OsNewLine() + ;
"Bits Pixel.: " + ValToPrgExp(nBitsColor2*nBitsColor1) + HB_OsNewLine() + ;
"")
DELETEDC_(hDc)
Return
#pragma BEGINDUMP
#include <windows.h>
#include <hbapi.h>
#include "hbapiitm.h"
#ifdef __XHARBOUR__
#define HB_STORC( n, x, y ) hb_storc( n, x, y )
#else
#define HB_STORC( n, x, y ) hb_storvc( n, x, y )
#endif
#define MAX_FILE_NAME 1024
HB_FUNC ( WIN_GETDEVICECAPS_ ) // GetDevCaps ( hwnd )
{
INT ix;
HDC hdc;
HWND hwnd;
hwnd = (HWND) hb_parnl(1);
// hdc = GetDC( hwnd );
// ix = GetDeviceCaps( hdc, LOGPIXELSX );
ix = GetDeviceCaps( hwnd, LOGPIXELSX );
// ix = GetDeviceCaps( hwnd, hb_parnl(2) );
// ReleaseDC( hwnd, hdc );
hb_retni( (UINT) ix );
}
HB_FUNC( CREATEDC_ )
{
hb_retnl( ( LONG ) CreateDC( hb_parc( 1 ), hb_parc( 2 ), hb_parc( 3 ), 0 ) );
}
HB_FUNC( DELETEDC_ )
{
hb_retl( DeleteDC( ( HDC ) hb_parnl( 1 ) ) );
}
HB_FUNC( WINDEFAULTPRINTER )
{
DWORD x, y ;
UCHAR lpReturnedString[MAX_FILE_NAME] ;
x = GetProfileString("windows","device","",lpReturnedString,MAX_FILE_NAME-1);
y = 0 ;
while ( y < x && lpReturnedString[y] != ',' )
y++ ;
hb_retclen(lpReturnedString,y) ;
}
HB_FUNC( GETALLPRINTERS )
{
OSVERSIONINFO osvi;
DWORD dwSize = 0;
DWORD dwPrinters = 0;
DWORD i;
LPBYTE pBuffer ;
LPBYTE cBuffer ;
PRINTER_INFO_5* pInfo;
DWORD flags;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
flags = PRINTER_ENUM_CONNECTIONS|PRINTER_ENUM_LOCAL;
else
flags = PRINTER_ENUM_LOCAL;
EnumPrinters(flags, NULL, 5, NULL, 0, &dwSize, &dwPrinters);
pBuffer = GlobalAlloc(GPTR, dwSize);
if (pBuffer == NULL)
{
hb_reta(0);
return;
}
EnumPrinters(flags, NULL, 5, pBuffer, dwSize, &dwSize, &dwPrinters);
if (dwPrinters == 0)
{
hb_reta(0);
return;
}
pInfo = (PRINTER_INFO_5*)pBuffer;
hb_reta( dwPrinters );
for ( i = 0; i < dwPrinters; i++, pInfo++)
{
cBuffer = GlobalAlloc(GPTR, 256);
strcat(cBuffer,pInfo->pPrinterName);
strcat(cBuffer,",");
strcat(cBuffer,pInfo->pPortName);
HB_STORC( cBuffer , -1 , i+1 );
GlobalFree(cBuffer);
}
GlobalFree(pBuffer);
}
#pragma ENDDUMPO VQTIPO.EXE está funcionando pelo menos aqui. Não tive respostas se há alguma divergência em outro teste com outros usuários.
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Identificando uma impressora matricial
Olá Pablo,
No ano passado, com base nas dicas de vários colegas deste fórum, acabei montando este exemplo e que foi adaptado ao meu sistema, e está funcionando certinho até hoje, mesmo quando se instalou novas impressoras:
No ano passado, com base nas dicas de vários colegas deste fórum, acabei montando este exemplo e que foi adaptado ao meu sistema, e está funcionando certinho até hoje, mesmo quando se instalou novas impressoras:
Código: Selecionar todos
/*
Compilar com hbmk2 Nome_do_Teste -lhbwin
*/
#define MATRICIAL 1
#define DESC_LASER 2
Function Main()
Local cPrinter, i, nMaxLen:=0, nCor, nTPrin, nPrn, aPNomes:={}
Local aPrn:=Win_PrinterList(.t.,.f.)
If Empty( aPrn )
Alert("Nenhuma impressora Instalada")
Return
Endif
For i=1 To Len(aPrn)
AaDd(aPNomes , aPrn[i,1] )
nMaxLen := If( Len( aPrn[i,1] ) > nMaxLen, Len( aPrn[i,1] ), nMaxLen )
Next
Cls
While LastKey() # 27
nPrn := AChoice( 3, 1, Len( aPrn )+1, nMaxLen+1, aPNomes, .T., Nil , aPNomes )
If nPrn = 0
Return
Endi
cPrinter:=aPNomes[nPrn]
oPrinter:= Win_Prn():new(cPrinter)
oPrinter:create()
oPrinter:startdoc()
nCor:=oPrinter:numcolors()
nLar:=oPrinter:pagewidth()
nAlt:=oPrinter:pageheight()
oPrinter:TextOut( oPrinter:PrinterName + ": MaxRow() = " + Str( oPrinter:MaxRow(), 4 ) + " MaxCol() = " + Str( oPrinter:MaxCol(), 4 ) )
oPrinter:enddoc()
oPrinter:destroy()
nTPrin:=If( nCor<3 .And. nLar<1000 .And. nAlt<2000, MATRICIAL, DESC_LASER )
If nTPrin = 1
Alert( 'A impressora em: '+aPrn[nPrn,2]+' é Matricial' )
Else
Alert( 'A impressora em: '+aPrn[nPrn,2]+' é DeskJet ou Laser' )
Endi
EndDo
Return NilAbraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Identificando uma impressora matricial
Oi Jairo, pois é... é quase idêntico ao VQTIPO.EXE a única diferença que um mostra na tela e outro grava arquivo MATRIX.IMP contendo esses mesmos valores ou propriedades. Eu apenas quis estender este assunto pois como disse antes eu não tinha referências se está sendo útil e exata essa verificação, pois para mim aqui está suprindo de acordo com as impressoras aqui instaladas. Obrigado pelo seu esclarecimento, é muito bom ter um feed back...
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Identificando uma impressora matricial
Olá pessoal,
Vejam a solução que me passaram. Aqui ela funcionou legal
http://groups.google.com/group/harbour- ... 0caa7e585#
Abraços,
Rossine.
Vejam a solução que me passaram. Aqui ela funcionou legal
http://groups.google.com/group/harbour- ... 0caa7e585#
Abraços,
Rossine.
Rossine.
Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.


