Página 1 de 2

Identificando uma impressora matricial

Enviado: 26 Abr 2010 16:38
por locio
Tem como identificar via software se a impressora é matricial.

Lócio

Re: Identificando uma impressora matricial

Enviado: 03 Mai 2010 16:28
por Pablo César
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:

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.
Outro apaliativo que encontrei, em xHarbour seria:

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()))
       Endif
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

Re: Identificando uma impressora matricial

Enviado: 04 Mai 2010 23:14
por sygecom
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:

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
O Problema agora que as impressora matricial vem com USB e acaba ficando pouco mais devagar a impressão

Re: Identificando uma impressora matricial

Enviado: 05 Mai 2010 00:29
por Maligno
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,...

Re: Identificando uma impressora matricial

Enviado: 15 Mai 2010 17:56
por sygecom
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.

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

Identificando uma impressora matricial

Enviado: 08 Nov 2010 21:51
por Pablo César
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 ?

Re: Identificando uma impressora matricial

Enviado: 08 Nov 2010 22:49
por alaminojunior
Uma outra possibilidade sería atravéz da resolução da impressora.
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()
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.

Identificando uma impressora matricial

Enviado: 08 Nov 2010 23:01
por Pablo César
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

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 NIL
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

Identificando uma impressora matricial

Enviado: 09 Nov 2010 19:33
por Pablo César
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.

Descobrindo se a impressora é matricial ou laser

Enviado: 16 Mai 2012 08:24
por Itamar M. Lins Jr.
Usando o Harbour.

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
Saudações,
Itamar M. Lins Jr.

Descobrindo se a impressora é matricial ou laser

Enviado: 16 Mai 2012 09:01
por Pablo César
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.

Identificando uma impressora matricial

Enviado: 16 Mai 2012 16:40
por Pablo César
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:

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 ENDDUMP
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.

Identificando uma impressora matricial

Enviado: 16 Mai 2012 17:46
por Jairo Maia
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:

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 Nil

Identificando uma impressora matricial

Enviado: 16 Mai 2012 17:55
por Pablo César
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...

Identificando uma impressora matricial

Enviado: 18 Mai 2012 10:10
por rossine
Olá pessoal,

Vejam a solução que me passaram. Aqui ela funcionou legal :D

http://groups.google.com/group/harbour- ... 0caa7e585#

Abraços,

Rossine.