• Olá Visitante, se gosta do forum e pretende contribuir com um donativo para auxiliar nos encargos financeiros inerentes ao alojamento desta plataforma, pode encontrar mais informações sobre os várias formas disponíveis para o fazer no seguinte tópico: leia mais... O seu contributo é importante! Obrigado.

Configurar impressora em VB6

Tedioboy

GF Ouro
Entrou
Ago 12, 2010
Mensagens
988
Gostos Recebidos
1
Amigos:

Continuo fiel ao meu velhinho VB6 e confesso que até este momento ainda não se desiludiu, no entanto estou com um problema que não consigo encontrar resposta...
Necessitava, num pequeno programa, de chamar a rotina de configuração da impressora padrão sem a utilização do CommonDialog, isto porque tratando-se de uma pequena aplicação, não necessitaria de nenhum setup para instalação da mesma e para instalar o dll correspondente ao CommonDialog na pasta de acesso apenas ao Administrador do sistema.
O que eu precisava mesmo era saber qual a API e rotina que o CommonDialog chama para mostrar a janela de setup da impressora padrão...

Alguém sabe como fazer?

Obrigado em antecipação.

:espi28: Cumps.
 

xor_axax

GF Ouro
Membro Inactivo
Entrou
Jul 16, 2007
Mensagens
689
Gostos Recebidos
0
Amigos:

Continuo fiel ao meu velhinho VB6 e confesso que até este momento ainda não se desiludiu, no entanto estou com um problema que não consigo encontrar resposta...
Necessitava, num pequeno programa, de chamar a rotina de configuração da impressora padrão sem a utilização do CommonDialog, isto porque tratando-se de uma pequena aplicação, não necessitaria de nenhum setup para instalação da mesma e para instalar o dll correspondente ao CommonDialog na pasta de acesso apenas ao Administrador do sistema.
O que eu precisava mesmo era saber qual a API e rotina que o CommonDialog chama para mostrar a janela de setup da impressora padrão...

Alguém sabe como fazer?

Obrigado em antecipação.

:espi28: Cumps.


Procura em vbnet.mvps.org que de certeza vais encontrar o que precisas.
 

xor_axax

GF Ouro
Membro Inactivo
Entrou
Jul 16, 2007
Mensagens
689
Gostos Recebidos
0
Vê se o codigo em baixo serve para o que pretendes.


Código:
Private Const SW_SHOWNORMAL As Long = 1

Private Declare Function ConnectToPrinterDlg Lib "winspool.drv" _
   (ByVal hwnd As Long, ByVal flags As Long) As Long

Private Declare Function ShellExecute Lib "shell32.dll" _
    Alias "ShellExecuteA" _
   (ByVal hwnd As Long, _
    ByVal lpOperation As String, _
    ByVal lpFile As String, _
    ByVal lpParameters As String, _
    ByVal lpDirectory As String, _
    ByVal nShowCmd As Long) As Long
    


Private Sub Form_Load()

   Dim cnt As Long
   
   For cnt = 0 To 2
   
      If cnt > 0 Then Load Command1(cnt)
      
      With Command1(cnt)
      
         .Move 200, 200 + (370 * cnt), 2000, 345
         .Visible = True
         
         Select Case cnt
            Case 0: .Caption = "Connect Net Printer"
            Case 1: .Caption = "Open Explorer"
            Case 2: .Caption = "Exit"
         End Select
         
      End With
      
   Next  'cnt
         
End Sub


Private Sub Command1_Click(Index As Integer)

   Select Case Index
   
      Case 0: 'Map network printer
              
              'If ConnectToPrinterDlg succeeds and the
              'user selects a printer, the return value
              'is a handle to the selected printer. If
              'the call fails, or the user cancels the
              'dialog box without selecting a printer,
              'the return value is 0.
 
              'Note that ConnectToPrinterDlg is not
              'available on Windows versions prior to NT 3.51.
              'Windows 95-ME users must use the corresponding
              'rundll32 command to invoke the Add Printer dialog:
              'Call Shell("rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL AddPrinter", vbNormalFocus)
              
              'print result to debug window
               Debug.Print ConnectToPrinterDlg(Me.hwnd, 0&)

      Case 1: 'show printers
               Call ShellExecute(0&, "Open", _
                                     "explorer.exe", _
                                     "/e,::{2227A280-3AEA-1069-A2DE-08002B30309D}", _
                                     0&, SW_SHOWNORMAL)
      Case 2: 'quit
               Unload Me
      
   End Select
   
End Sub
 

Tedioboy

GF Ouro
Entrou
Ago 12, 2010
Mensagens
988
Gostos Recebidos
1
Configurar Impressora em VB6...

Vê se o codigo em baixo serve para o que pretendes.

(...)
'rundll32 command to invoke the Add Printer dialog:
'Call Shell("rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL AddPrinter", vbNormalFocus)

(...)
Call ShellExecute(0&, "Open", _
"explorer.exe", _
"/e,::{2227A280-3AEA-1069-A2DE-08002B30309D}", _
0&, SW_SHOWNORMAL)
(...)

Boas!

Era quase isto que eu andava à procura...
Será que não existe uma hipótese de chamar uma rundll32 com uma linha de comando do género
Call Shell("rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL ShowPrinterProperties", vbNormalFocus
ou algo parecido, de forma a chamar a janela que se abre quando clicamos no botão direito sobre uma impressora e seleccionamos a última opção (Propriedades da Impressora)?

Não haverá, em alternativa, uma forma de fazer um
Call ShellExecute
mas em vez de abrir a janela do Explorer que mostra as impressoras instaladas, abra essa tal janela das propriedades da impressora?
A Janela que eu quero chamar para visualizar a partir do meu programa é a que mostro em anexo a este post.

Muito obrigado pela dica e pela tentativa de ajudar.

:espi28: Cumps.
 
Última edição:

xor_axax

GF Ouro
Membro Inactivo
Entrou
Jul 16, 2007
Mensagens
689
Gostos Recebidos
0
Eu não sou expert em VB. Sempre gostei mais de programar em C++ mas posso tentar pedir ajuda a amigos entendidos nessa linguagem para ver se esclarecem o que pretendes.
 

Tedioboy

GF Ouro
Entrou
Ago 12, 2010
Mensagens
988
Gostos Recebidos
1
Eu não sou expert em VB. Sempre gostei mais de programar em C++ mas posso tentar pedir ajuda a amigos entendidos nessa linguagem para ver se esclarecem o que pretendes.

Penso que se trata de algo mais relacionado com a API do Windows, até porque esta janela é aberta pelo Painel de Controlo e por outros programas do Windows. Ja tenho procurado pelas API's que o Control Panel eventualmente usa, mas as minhas pesquisas têm-se revelado infrutíferas...
 

xor_axax

GF Ouro
Membro Inactivo
Entrou
Jul 16, 2007
Mensagens
689
Gostos Recebidos
0
Penso que se trata de algo mais relacionado com a API do Windows, até porque esta janela é aberta pelo Painel de Controlo e por outros programas do Windows. Ja tenho procurado pelas API's que o Control Panel eventualmente usa, mas as minhas pesquisas têm-se revelado infrutíferas...

vê se é isto.
Código:
     Option Explicit

      Private Declare Function PrinterProperties Lib "winspool.drv" _
        (ByVal hwnd As Long, ByVal hPrinter As Long) As Long

      Private Declare Function OpenPrinter Lib "winspool.drv" _
        Alias "OpenPrinterA" (ByVal pPrinterName As String, _
        phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long

      Private Declare Function ClosePrinter Lib "winspool.drv" _
        (ByVal hPrinter As Long) As Long

      Private Type PRINTER_DEFAULTS
           pDatatype As Long ' String
           pDevMode As Long
           pDesiredAccess As Long
      End Type

      Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
      Private Const PRINTER_ACCESS_ADMINISTER = &H4
      Private Const PRINTER_ACCESS_USE = &H8
      Private Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or _
         PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE)

      Private Sub Form_Load()
         Dim I As Integer

         ' List all available printers
         For I = 0 To Printers.Count - 1
            List1.AddItem Printers(I).DeviceName
            If Printers(I).DeviceName = Printer.DeviceName Then
               List1.Selected(I) = True  ' Select current default printer
            End If
         Next I
      End Sub

      Private Sub List1_Click()
         Dim Prt As Printer

         ' Find and use the printer just selected in the ListBox
         For Each Prt In Printers
            If Prt.DeviceName = List1.Text Then
                  Set Printer = Prt
               Exit For
            End If
         Next
      End Sub

      Private Sub Command1_Click()
         Dim RetVal As Long, hPrinter As Long
         Dim PD As PRINTER_DEFAULTS

         PD.pDatatype = 0
         ' Note that you cannot request more rights than you have as a user
         PD.pDesiredAccess = STANDARD_RIGHTS_REQUIRED Or PRINTER_ACCESS_USE
         PD.pDevMode = 0
         RetVal = OpenPrinter(Printer.DeviceName, hPrinter, PD)
         If RetVal = 0 Then
             MsgBox "OpenPrinter Failed!"
         Else
             RetVal = PrinterProperties(Me.hwnd, hPrinter)
             RetVal = ClosePrinter(hPrinter)
         End If
      End Sub
 

Tedioboy

GF Ouro
Entrou
Ago 12, 2010
Mensagens
988
Gostos Recebidos
1
Problema resolvido!

Caros Amigos:

Agradeço toda a ajuda prestada, aprendi mais algumas coisas com elas...
Quero aqui partilhar a solução que acabei por encontrar, pode dar jeito a quem queira aproveitar a dica.
Está em VB6 mas fácilmente se adapta a versões mais recentes.

A rotina da API a chamar é
Private Declare Function SHInvokePrinterCommand Lib "shell32.dll" Alias "SHInvokePrinterCommandA" _
(ByVal hwnd As Long, ByVal uAction As Long, _
ByVal lBuf1 As String, ByVal lBuf2 As String, ByVal fModal As Boolean) As Long
Para chamar esta função usa-se o comando
SHInvokePrinterCommand Me.hwnd, &H6, Printer.DeviceName, vbNull, False

Usei este comando de uma forma ligeiramente diferente no meu programa:

Criei uma listbox de nome Impressoras e no Event Form_Load preencho-a com todas as impressoras activas no computador:
Código:
[COLOR="red"]Private Sub Form_Load()

Dim Prt As Printer

For Each Prt In Printers
  Impressoras.AddItem Prt.DeviceName
  If Prt.DeviceName = Printer.DeviceName Then_
    Impressoras.ListIndex = Impressoras.NewIndex
Next

End Sub[/COLOR]

Criei um botão ao lado da listbox de nome ConfImpressora e no Event ConfImpressora_Click escrevi:
Código:
[COLOR="red"]Private Sub ConfImpressora_Click()

SHInvokePrinterCommand Me.hwnd, &H6, Impressoras.Text, vbNull, False

End Sub[/COLOR]

De acrescentar que se em vez de &H6 no segundo parâmetro se colocar &H1, a rotina mostra a página inicial das propriedades da impressora.

Era precisamente isto que eu pretendia!

:espi28: Cumps e boas programações!
 
Última edição:

liperoll

Novo
Membro Inactivo
Entrou
Jul 17, 2012
Mensagens
1
Gostos Recebidos
0
Meus caros,
Alguém saberia dizer se há alguma propriedade do objeto Printer que diga se a impressora é matricial, jato de tinta ou laser?
Não precisa necessariamente ser do objeto printer, pode ser qualquer outra forma de pegar essa informação no VB6.

Abs.
 
Topo