Seleccionar impresora

En mi programa quiero mandar a imprimir a la impresora seleccionada en un CommonDialog, pero siempre imprime en la predeterminada. ¿Hay alguna forma de saber la impresora SELECCIONADA en el CommonDialog y poder ponerla como predeterminada?.

1 respuesta

Respuesta
1
Sí se puede te explico como puedes saber cual es la impresora predeterminada.
Public Function GetDefaultPrinter() As Printer
Dim strBuffer As String * 254
Dim iRetValue As Long
Dim strDefaultPrinterInfo As String
Dim tblDefaultPrinterInfo() As String
Dim objPrinter As Printer
iRetValue = GetProfileString("windows", "device", ",,,", strBuffer, 254)
strDefaultPrinterInfo = Left(strBuffer, InStr(strBuffer, Chr(0)) - 1)
tblDefaultPrinterInfo = Split(strDefaultPrinterInfo, ",")
For Each objPrinter In Printers
If objPrinter.DeviceName = tblDefaultPrinterInfo(0) Then
'Impresora detectada
Exit For
End If
Next
'Si no se encuentra devuelve Nothing
If objPrinter.DeviceName <> tblDefaultPrinterInfo(0) Then
Set objPrinter = Nothing
End If
Set GetDefaultPrinter = objPrinter
End Function
Private Sub Form_Load()
Dim objPrinter As Printer
Set objPrinter = GetDefaultPrinter()
MsgBox "La impresora predeterminada es: " + objPrinter.DeviceName
MsgBox "El nombre del driver es: " + objPrinter.DriverName
MsgBox "El puerto es: " + objPrinter.Port
Set objPrinter = Nothing
End Sub
Ahora, con este código puedes cambiar de impresora predeterminada:
Como cambiar la impresora por defecto
La siguiente rutina nos muestra cómo podemos cambiar la impresora establecida por defecto en nuestro sistema.
Esta alternativa no cambia la impresora por defecto para las otras aplicaciones. Sólo lo hará para la aplicación que actualmente se está ejecutando.
Los pasos necesarios para implementar la alternativa:
1. Crear un nuevo proyecto el cual tendrá un nuevo form con un Listbox, un CommandButton y un módulo.
Añadiremos el siguiente código a un módulo:
Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long
Declare Function WriteProfileString Lib "kernel32" Alias "WriteProfileStringA" (ByVal lpszSection As String, ByVal _
lpszKeyName As String, ByVal lpszString As String) As Long
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lparam As String) As Long
Public Const HWND_BROADCAST = &HFFFF
Public Const WM_WININICHANGE = &H1A
2. En un formulario que contendrá un Listbox en la que se mostrarán las impresoras instaladas añadiremos adicionalmente,
un botón que nos permitirá seleccionar una de las impresoras que se muestran en las Listbox.
Código del CommandButton:
Dim r As Long
Dim Buffer As String
Dim DeviceName As String
Dim DriverName As String
Dim PrinterPort As String
Dim PrinterName As String
If List1.ListIndex > -1 Then
Buffer = Space(1024)
PrinterName = List1.Text
r = GetProfileString("PrinterPorts", PrinterName, "", Buffer, Len(Buffer))
GetDriverAndPort Buffer, DriverName, PrinterPort
If DriverName <> "" And PrinterPort <> "" Then
SetDefaultPrinter List1.Text, DriverName, PrinterPort
End If
End If
Código del evento Load del formulario:
Dim r As Long
Dim Buffer As String
Buffer = Space(8192)
r = GetProfileString("PrinterPorts", vbNullString, "", Buffer, Len(Buffer))
ParseList List1, Buffer
Funciones auxiliares a situar en la sección declaraciones del formulario:
Sub SetDefaultPrinter(ByVal PrinterName As String, ByVal DriverName As String, ByVal PrinterPort As String)
Dim DeviceLine As String
Dim r As Long
Dim l As Long
DeviceLine = PrinterName & "," & DriverName & "," & PrinterPort
r = WriteProfileString("windows", "Device", DeviceLine)
l = SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, "windows")
End Sub
Sub ParseList(lstCtl As Control, ByVal Buffer As String)
Dim i As Integer
Do
i = InStr(Buffer, Chr(0))
If i > 0 Then
lstCtl.AddItem Left(Buffer, i - 1)
Buffer = Mid(Buffer, i + 1)
Else
lstCtl.AddItem Buffer
Buffer = ""
End If
Loop While i > 0
End Sub
Sub GetDriverAndPort(ByVal Buffer As String, DriverName As String, PrinterPort As String)
Dim r As Integer
Dim iDriver As Integer
Dim iPort As Integer
DriverName = ""
PrinterPort = ""
iDriver = InStr(Buffer, ",")
If iDriver > 0 Then
DriverName = Left(Buffer, iDriver - 1)
iPort = InStr(iDriver + 1, Buffer, ",")
If iPort > 0 Then
PrinterPort = Mid(Buffer, iDriver + 1, iPort - iDriver - 1)
End If
End If
End Sub
Un poco larga tu solución, todavía no la probé, pero todo me indica que no es lo que estoy buscando. Yo necesito que el programa me diga "Ud ha seleccionado tal impresora", con solo hacerle un click al CommonDialog, ya que de esa manera puedo solucionar mi problema de una forma más fácil, sin recurrir a las API´s. Necesito saber el nombre de la impresora seleccionada (no la predeterminada) del cuadro de dialogo.
Desde ya te agradezco tu esfuerzo.
Yo no he encontrado forma de obtener el nombre de la impresora seleccionada sin usar apis.
Para que te imprima por la que selecciones prueba a poner la propiedad printerdefault del commondialog a false. Así no cambiará la seleccionada por defecto.
Simplemente voy a recurrir a las apis.
No me queda otra.
Ya he probado de cambiarle el printerdefault a false, sin embargo hace lo mismo, imprime en la impresora por defecto.
Muchas gracias.
He probado lo de printerdefault y lo que hace es que no te marque como predeterminada la impresora que selecciones en el cuadro de dialogo pero te imprime por la que tu selecciones en ese cuadro de dialogo:
Commondialog1. Showprinter

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas