CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 5 of 5
  1. #1
    Join Date
    Aug 2001
    Posts
    7

    default printer confirm

    I have built a mail merge program that prints to my local printer. I have a little problem in that it always asks to confirm the printer. Must I change my printer defaults on my system, or can within my vb program simply say print with default printer confirm yes or something like that?


  2. #2
    Join Date
    May 2000
    Location
    New York, NY, USA
    Posts
    2,878

    Re: default printer confirm

    'that is changing default printer only for current application
    but it won't change default printer windows wide

    Code:
    Private Function SelectPrinter(ByVal printer_name As String) As Boolean
    Dim i As Integer
    
        SelectPrinter = True
        For i = 0 To Printers.Count - 1
            If Printers(i).DeviceName = printer_name Then
                Set Printer = Printers(i)
                SelectPrinter = False
                Exit For
            End If
        Next i
    End Function
    
    
    Private Sub Form_Load()
    Dim i As Integer
    
        cboPrinter.Clear
        For i = 0 To Printers.Count - 1
            cboPrinter.AddItem Printers(i).DeviceName
        Next i
    End Sub
    
    'choose in combo printer_name 
    Iouri Boutchkine
    [email protected]
    Last edited by Cimperiali; October 29th, 2003 at 11:57 AM.
    Iouri Boutchkine
    [email protected]

  3. #3
    Join Date
    May 2000
    Location
    New York, NY, USA
    Posts
    2,878

    Re: default printer confirm

    Change default printer system wide

    'module
    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

    Public Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
    End Type

    Declare Function GetVersionExA Lib "kernel32" _
    (lpVersionInformation As OSVERSIONINFO) As Integer

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

    Public Declare Function SetPrinter Lib "winspool.drv" _
    Alias "SetPrinterA" _
    (ByVal hPrinter As Long, _
    ByVal Level As Long, _
    pPrinter As Any, _
    ByVal Command As Long) As Long

    Public Declare Function GetPrinter Lib "winspool.drv" _
    Alias "GetPrinterA" _
    (ByVal hPrinter As Long, _
    ByVal Level As Long, _
    pPrinter As Any, _
    ByVal cbBuf As Long, _
    pcbNeeded As Long) As Long

    Public Declare Function lstrcpy Lib "kernel32" _
    Alias "lstrcpyA" _
    (ByVal lpString1 As String, _
    ByVal lpString2 As Any) As Long

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

    ' constants for DEVMODE structure
    Public Const CCHDEVICENAME = 32
    Public Const CCHFORMNAME = 32

    ' constants for DesiredAccess member of PRINTER_DEFAULTS
    Public Const STANDARD_RIGHTS_REQUIRED = &HF0000
    Public Const PRINTER_ACCESS_ADMINISTER = &H4
    Public Const PRINTER_ACCESS_USE = &H8
    Public Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or _
    PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE)

    ' constant that goes into PRINTER_INFO_5 Attributes member
    ' to set it as default
    Public Const PRINTER_ATTRIBUTE_DEFAULT = 4

    'Constant for OSVERSIONINFO.dwPlatformId
    Public Const VER_PLATFORM_WIN32_WINDOWS = 1

    Public Type DEVMODE
    dmDeviceName As String * CCHDEVICENAME
    dmSpecVersion As Integer
    dmDriverVersion As Integer
    dmSize As Integer
    dmDriverExtra As Integer
    dmFields As Long
    dmOrientation As Integer
    dmPaperSize As Integer
    dmPaperLength As Integer
    dmPaperWidth As Integer
    dmScale As Integer
    dmCopies As Integer
    dmDefaultSource As Integer
    dmPrintQuality As Integer
    dmColor As Integer
    dmDuplex As Integer
    dmYResolution As Integer
    dmTTOption As Integer
    dmCollate As Integer
    dmFormName As String * CCHFORMNAME
    dmLogPixels As Integer
    dmBitsPerPel As Long
    dmPelsWidth As Long
    dmPelsHeight As Long
    dmDisplayFlags As Long
    dmDisplayFrequency As Long
    dmICMMethod As Long ' // Windows 95 only
    dmICMIntent As Long ' // Windows 95 only
    dmMediaType As Long ' // Windows 95 only
    dmDitherType As Long ' // Windows 95 only
    dmReserved1 As Long ' // Windows 95 only
    dmReserved2 As Long ' // Windows 95 only
    End Type

    Public Type PRINTER_INFO_5
    pPrinterName As String
    pPortName As String
    Attributes As Long
    DeviceNotSelectedTimeout As Long
    TransmissionRetryTimeout As Long
    End Type

    Public Type PRINTER_DEFAULTS
    pDatatype As Long
    pDevMode As Long
    DesiredAccess As Long
    End Type


    'form (Listbox and command button)
    Private Function PtrCtoVbString(Add As Long) As String

    Dim sTemp As String * 512, x As Long

    x = lstrcpy(sTemp, Add)
    If (InStr(1, sTemp, Chr(0)) = 0) Then
    PtrCtoVbString = ""
    Else
    PtrCtoVbString = Left(sTemp, InStr(1, sTemp, Chr(0)) - 1)
    End If
    End Function

    Private 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
    ' Store the new printer information in the [WINDOWS] section of
    ' the WIN.INI file for the DEVICE= item
    r = WriteProfileString("windows", "Device", DeviceLine)
    ' Cause all applications to reload the INI file:
    l = SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, "windows")
    End Sub

    Private Sub Win95SetDefaultPrinter()
    Dim Handle As Long 'handle to printer
    Dim PrinterName As String
    Dim pd As PRINTER_DEFAULTS
    Dim x As Long
    Dim need As Long ' bytes needed
    Dim pi5 As PRINTER_INFO_5 ' your PRINTER_INFO structure
    Dim LastError As Long

    ' determine which printer was selected
    PrinterName = List1.List(List1.ListIndex)
    ' none - exit
    If PrinterName = "" Then
    Exit Sub
    End If

    ' set the PRINTER_DEFAULTS members
    pd.pDatatype = 0&
    pd.DesiredAccess = PRINTER_ALL_ACCESS Or pd.DesiredAccess

    ' Get a handle to the printer
    x = OpenPrinter(PrinterName, Handle, pd)
    ' failed the open
    If x = False Then
    'error handler code goes here
    Exit Sub
    End If

    ' Make an initial call to GetPrinter, requesting Level 5
    ' (PRINTER_INFO_5) information, to determine how many bytes
    ' you need
    x = GetPrinter(Handle, 5, ByVal 0&, 0, need)
    ' don't want to check Err.LastDllError here - it's supposed
    ' to fail
    ' with a 122 - ERROR_INSUFFICIENT_BUFFER
    ' redim t as large as you need
    ReDim t((need \ 4)) As Long

    ' and call GetPrinter for keepers this time
    x = GetPrinter(Handle, 5, t(0), need, need)
    ' failed the GetPrinter
    If x = False Then
    'error handler code goes here
    Exit Sub
    End If

    ' set the members of the pi5 structure for use with SetPrinter.
    ' PtrCtoVbString copies the memory pointed at by the two string
    ' pointers contained in the t() array into a Visual Basic string.
    ' The other three elements are just DWORDS (long integers) and
    ' don't require any conversion
    pi5.pPrinterName = PtrCtoVbString(t(0))
    pi5.pPortName = PtrCtoVbString(t(1))
    pi5.Attributes = t(2)
    pi5.DeviceNotSelectedTimeout = t(3)
    pi5.TransmissionRetryTimeout = t(4)

    ' this is the critical flag that makes it the default printer
    pi5.Attributes = PRINTER_ATTRIBUTE_DEFAULT

    ' call SetPrinter to set it
    x = SetPrinter(Handle, 5, pi5, 0)
    ' failed the SetPrinter
    If x = False Then
    MsgBox "SetPrinterFailed. Error code: " & Err.LastDllError
    Exit Sub
    End If

    ' and close the handle
    ClosePrinter (Handle)

    End Sub

    Private Sub GetDriverAndPort(ByVal Buffer As String, DriverName As _
    String, PrinterPort As String)

    Dim iDriver As Integer
    Dim iPort As Integer
    DriverName = ""
    PrinterPort = ""

    'The driver name is first in the string terminated by a comma
    iDriver = InStr(Buffer, ",")
    If iDriver > 0 Then

    'Strip out the driver name
    DriverName = Left(Buffer, iDriver - 1)

    'The port name is the second entry after the driver name
    'separated by commas.
    iPort = InStr(iDriver + 1, Buffer, ",")

    If iPort > 0 Then
    'Strip out the port name
    PrinterPort = Mid(Buffer, iDriver + 1, _
    iPort - iDriver - 1)
    End If
    End If
    End Sub

    Private Sub ParseList(lstCtl As Control, ByVal Buffer As String)
    Dim i As Integer

    Dim s As String

    Do
    i = InStr(Buffer, Chr(0))
    If i > 0 Then
    s = Left(Buffer, i - 1)
    If Len(Trim(s)) Then lstCtl.AddItem s
    Buffer = Mid(Buffer, i + 1)
    Else
    If Len(Trim(Buffer)) Then lstCtl.AddItem Buffer
    Buffer = ""
    End If
    Loop While i > 0
    End Sub

    Private Sub WinNTSetDefaultPrinter()
    Dim Buffer As String
    Dim DeviceName As String
    Dim DriverName As String
    Dim PrinterPort As String
    Dim PrinterName As String
    Dim r As Long
    If List1.ListIndex > -1 Then
    'Get the printer information for the currently selected
    'printer in the list. The information is taken from the
    'WIN.INI file.
    Buffer = Space(1024)
    PrinterName = List1.Text
    r = GetProfileString("PrinterPorts", PrinterName, "", _
    Buffer, Len(Buffer))

    'Parse the driver name and port name out of the buffer
    GetDriverAndPort Buffer, DriverName, PrinterPort

    If DriverName <> "" And PrinterPort <> "" Then
    SetDefaultPrinter List1.Text, DriverName, PrinterPort
    End If
    End If
    End Sub

    Private Sub Command1_Click()
    Dim osinfo As OSVERSIONINFO
    Dim retvalue As Integer

    osinfo.dwOSVersionInfoSize = 148
    osinfo.szCSDVersion = Space$(128)
    retvalue = GetVersionExA(osinfo)

    If osinfo.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then
    Call Win95SetDefaultPrinter
    Else
    'This assumes that future versions of Windows use the NT method
    Call WinNTSetDefaultPrinter
    End If
    End Sub

    Private Sub Form_Load()
    Dim r As Long
    Dim Buffer As String

    'Get the list of available printers from WIN.INI
    Buffer = Space(8192)
    r = GetProfileString("PrinterPorts", vbNullString, "", _
    Buffer, Len(Buffer))

    'Display the list of printer in the list box List1
    ParseList List1, Buffer
    End Sub




    Iouri Boutchkine
    [email protected]
    Iouri Boutchkine
    [email protected]

  4. #4
    Join Date
    Aug 2001
    Posts
    7

    Re: default printer confirm

    Thank you for you intensive piece of code, I think That I may not have explained my problem good enought. As with every VB problem I guess it's understanding the problem that is half of the solution.
    When I do my mail merge, My word application in .visible = false so all is done in the background and nothing appears on the screen.

    The mail merge is sucessfull as I can out put it two ways
    .Destination = wdSendToDocument
    or
    .Destination = wdSendToPrinter

    Once I execute my merge,

    .Execute Pause:=True

    I get my output either sent to a new word documents
    or in case two to my printer.
    It is at this point I am having a problem
    I continually get a window poping up to select my printer(which is already selected as my default printer) I must press the OK button to continue printing.
    I want to skip this window and the OK button.
    Is there not a "confirm=false" or some thing like when you save
    " wdApp.ActiveDocument.Close (False) "
    How about
    wdapp.activedocument.printout (false)
    there must be something simple.




  5. #5
    Join Date
    Jan 2006
    Posts
    2

    Re: default printer confirm

    I understand how is possible to set the default printer , but i need to set only the printer for my application.
    I try to describe my problem: I have two datareport in vb6 application.
    The first will be printed with the default printer but i must to print the second on another printer so i can't change the default printer of the pc .
    thank u

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured